mysql事务

Spring事务失效的 8 大原因,这次可以吊打面试官了!

谁说胖子不能爱 提交于 2020-01-07 12:06:27
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 今天再来一篇《 吊打面试官 》系列,这次真的要吊打了,哈哈!(看往期吊打系列请在后台回复: 吊打 ,我会陆续更新……) 前几天栈长不是发了一篇文章,里面有一个关于事务失效的问题: 用 Spring 的 @Transactional 注解控制事务有哪些不生效的场景? 其中有个热心粉丝留言分享了下,我觉得总结得有点经验,给置顶了: 以上留言来源微信公众号:Java技术栈,关注一起学Java! 但是我觉得还是总结得不够全,今天栈长我再总结一下,再延着这位粉丝的总结再补充完善一下,不用说,我肯定也不见得总结全,但希望可以帮忙有需要的人。 1、数据库引擎不支持事务 这里以 MySQL 为例,其 MyISAM 引擎是不支持事务操作的,InnoDB 才是支持事务的引擎,一般要支持事务都会使用 InnoDB。 根据 MySQL 的官方文档: https://dev.mysql.com/doc/refman/5.5/en/storage-engine-setting.html 从 MySQL 5.5.5 开始的默认存储引擎是:InnoDB,之前默认的都是:MyISAM,所以这点要值得注意,底层引擎不支持事务再怎么搞都是白搭。 2、没有被 Spring 管理 如下面例子所示: // @Service public class

MySQL索引与事务详解

落花浮王杯 提交于 2020-01-07 11:32:21
MySQL索引与事务详解 一、前言 ​ 上一章我们讲解了MySQL的手工编译安装流程以及相关的数据库操作命令(sql语句),本文将要详细介绍MySQL索引与事务的概念及原理,并初步了解MySQL数据库视图概念,简述数据库的存储过程。 二、索引 2.1索引的概念——什么是索引? ​ 一般来说,一篇论文,或者说一本书,都有其目录,而目录一般是所有章节的概述,或者说是要点核心,而索引的概念其实也与之类似。 ​ 索引,顾名思义,就是一个方便用户搜索所需资源的引导,只不过在数据库中,索引一般被认为是一种特殊的文件,尤其在Linux系统中("一切皆文件")。从专业术语上解释其含义就是“代表记录的引用指针”。 2.2索引的作用 加快查询速度,提高工作效率; 降低i/o成本,提供基础排序; 加快多表之间的连接; 支持唯一性索引(下面会介绍什么是唯一性索引),保证数据表中数据的唯一性性; 2.3索引的分类 2.3.1普通索引 ​ 就是一般的索引,只是为了区别于其他特殊索引的一个统称 2.3.2唯一性索引 ​ 与普通索引基本类同,区别在于,唯一性索引的列中的所有值都不相同,即“唯一”。 ​ 简单举例来说,学生数据表,年龄可以是普通索引,但不可以是唯一性索引,但是详细住址可以是。 2.3.3主键索引 ​ 本质上也是一种唯一性索引,但必须指定为“primary key”,该索引要求主键中的每个值都唯一

nodejs mysql 事务封装

拟墨画扇 提交于 2020-01-07 08:51:22
mysql.js const mysql = require("mysql2"); class MysqlModel { constructor() { this.mysqlConfig = config.mysql; } /** * 实例化mysql */ mysqlInstance() { const poolCluster = mysql.createPoolCluster({ removeNodeErrorCount: 1, // Remove the node immediately when connection fails. defaultSelector: "RR" //RR,RANDOM,ORDER }); const mysqlNodes = this.mysqlConfig; for (let node in mysqlNodes) { poolCluster.add(`${node}`, mysqlNodes[`${node}`]); } return new Promise((resolve, reject) => { poolCluster.getConnection(function (err, connection) { if (err) { reject(err); } else { resolve([ connection,

MySQL MVCC Undo log Redo log

我的未来我决定 提交于 2020-01-07 08:38:47
目录 什么是MVCC? MVCC-插入 MVCC-删除 MVCC-修改 MVCC-查询 Undo log Redo log 什么是MVCC? Multi Version Concurrency Control (多版本并发控制) 并发访问(读或写)数据库时,对事务内正在处理的数据做多版本管理。以实现写操作堵塞的同时,依然可以进行读操作。 MVCC-插入 插入规则:在数据行版本号列保存当前事务ID。 MVCC-删除 删除规则:将删除版本号列更新为当前事务ID。 MVCC-修改 修改规则:现将命中的数据行copy,将原数据的删除版本号设置为当前事务ID(33)。 MVCC-查询 查询规则: 1. 查找数据行版本小于或等于当前事务版本的数据行。这样可以确保事务读取的行,要么是在事务开始之前就存在的,要么是事务自身插入或修改过的; 2. 查找删除版本号要么为NULL,要么大于当前事务版本号的数据行。这样可以确保查询出来的记录在事务开启前没有被删除。 Undo log Undo意为取消,以撤销操作为目的,返回指定某个状态的操作。 Undo log指事务开始之前,在操作任何数据之前,首先将需操作的数据备份到一个地方 (Undo Log)。 UndoLog是为了实现事务的原子性而出现的产物。 Undo Log实现了事务的原子性: 事务处理过程中如果出现了错误或者用户执行了 ROLLBACK语句

MySQL中的共享锁与排他锁

不羁岁月 提交于 2020-01-07 07:59:35
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 在 MySQL中的行级锁,表级锁,页级锁 中介绍过,行级锁是Mysql中锁定粒度最细的一种锁,行级锁能大大减少数据库操作的冲突。行级锁分为共享锁和排他锁两种,本文将详细介绍共享锁及排他锁的概念、使用方式及注意事项等。 共享锁(Share Lock) 共享锁又称读锁,是读取操作创建的锁。其他用户可以并发读取数据,但任何事务都不能对数据进行修改(获取数据上的排他锁),直到已释放所有共享锁。 如果事务T对数据A加上共享锁后,则其他事务只能对A再加共享锁,不能加排他锁。获准共享锁的事务只能读数据,不能修改数据。 用法 SELECT ... LOCK IN SHARE MODE; 在查询语句后面增加 LOCK IN SHARE MODE ,Mysql会对查询结果中的每行都加共享锁,当没有其他线程对查询结果集中的任何一行使用排他锁时,可以成功申请共享锁,否则会被阻塞。其他线程也可以读取使用了共享锁的表,而且这些线程读取的是同一个版本的数据。 排他锁(eXclusive Lock) 排他锁又称写锁,如果事务T对数据A加上排他锁后,则其他事务不能再对A加任任何类型的封锁。获准排他锁的事务既能读数据,又能修改数据。 用法 SELECT ... FOR UPDATE; 在查询语句后面增加 FOR UPDATE

MySQL中的共享锁与排他锁

爱⌒轻易说出口 提交于 2020-01-07 07:32:32
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 在 MySQL中的行级锁,表级锁,页级锁 中介绍过,行级锁是Mysql中锁定粒度最细的一种锁,行级锁能大大减少数据库操作的冲突。行级锁分为共享锁和排他锁两种,本文将详细介绍共享锁及排他锁的概念、使用方式及注意事项等。 共享锁(Share Lock) 共享锁又称读锁,是读取操作创建的锁。其他用户可以并发读取数据,但任何事务都不能对数据进行修改(获取数据上的排他锁),直到已释放所有共享锁。 如果事务T对数据A加上共享锁后,则其他事务只能对A再加共享锁,不能加排他锁。获准共享锁的事务只能读数据,不能修改数据。 用法 SELECT ... LOCK IN SHARE MODE; 在查询语句后面增加 LOCK IN SHARE MODE ,Mysql会对查询结果中的每行都加共享锁,当没有其他线程对查询结果集中的任何一行使用排他锁时,可以成功申请共享锁,否则会被阻塞。其他线程也可以读取使用了共享锁的表,而且这些线程读取的是同一个版本的数据。 排他锁(eXclusive Lock) 排他锁又称写锁,如果事务T对数据A加上排他锁后,则其他事务不能再对A加任任何类型的封锁。获准排他锁的事务既能读数据,又能修改数据。 用法 SELECT ... FOR UPDATE; 在查询语句后面增加 FOR UPDATE

Redo与Undo的理解

血红的双手。 提交于 2020-01-07 01:26:29
本文概要 本文分两部分, 第一部分概念介绍,重在理解。 第二部分通过MySQL Innodb中的具体实现,加深相关知识的印象。 本文的原意是一篇个人学习笔记,为了避免成为草草记录一下的流水账,尝试从给人介绍的角度开写。但在整理的过程中,越来越感觉力不从心,一是细节太多了,原以为足够了解的一个小知识点下可能隐藏了很多细节;二是内容与范围的取舍,既想有点技术性避免空谈,又不想陷入枯燥冗长的小细节描述。几番折腾,目前的想法把坑填上,能写完就不错了,你读起来有不顺或错误的地方请见谅,欢迎反馈。 1. 概念与理解 Redo与undo并非是相互的逆操作,而是能配合起来使用的两种机制。 说是两种机制,其实都是日志记录,不同的是redo记录以顺序附加的形式记录新值,如某条记录<T,X,V>,表示事物T将新值V存储到 数据库 元素X,新值可以保证重做; 而Undo记录通常以随机操作的形式记录旧值,如某条记录<T1,Y,9>,表示事物T1对Y进行了修改,修改前Y的值是9,旧值能用于撤销,也能供其他事务读取。 Redo用来保证事务的原子性和持久性,Undo能保证事务的一致性,两者也是系统恢复的基础前提。 1.1 Redo 一个事务从开始到结束,要么提交完成,要么中止,具有原子性。而反映在redo日志中可能需要若干条记录来保证,如: <T0 start> <T0,A,500> <T0,B,500> <T0

mysql 事务隔离级别如何选择

半腔热情 提交于 2020-01-07 01:02:31
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 四个概念: 数据丢失、脏读、不可重复读、幻读 数据丢失,两个事务同时进行,一个成功一个失败,造成数据回滚,或者两个都成功造成数据覆盖 从这个概念,就可以看出事务隔离的必要性,如果没有的话很容易产生这个严重的问题 脏读:在一个事务里面,读取到另一个事务还没提交的数据 不可重复读:一个事务内两次读同一个数据,可能发生变化(一般指该数据事务期间被别的事务修改,理解对一条数据操作) 幻读:一个事务内两次查询数据不一致(条件查询,理解多条数据,其他事务有新增或者删除) 事务隔离分为4个级别 1.read uncommit (读未提交),存在脏读、不可重复度问题、幻读 2.read commit (读已提交),存在不可重复读、幻读 3.repeatable read(可重复读),存在幻读 4.serialable(串行化),没有上面的问题,但性能过低 mysql,默认使用 rr 级别,它通过 mvvc 解决可重复读问题 ,通过 next-key 解决了幻读的问题,next-key 包含 记录锁和 间隙锁 关于 mysql 锁可以参考这篇文章 https://www.linuxidc.com/Linux/2018-11/155501.htm 来源: oschina 链接: https://my.oschina.net

通俗解释MYSQL事务有关的特性

三世轮回 提交于 2020-01-06 22:05:58
不同事务同时进行读写操作时,有可能出现以下情况: 脏写,脏读,不可重复读,幻读 它们对读写结果的影响以及严重性由高到低。即:脏写>脏读>不可重复读>幻读 以下情况仅只涉及出现的场景或者原因,解决方案另外讨论,这里不展开 1,脏写,就是指——开启事务后对某一张表写入数据并成功提交后,最终的数据却并没有真正存进表里的现象。好像这数据白写了一样,此之为“脏写”。 场景例子: 假设有2个事务A和B在某一时刻(暂且称呼为0点)一起开启了,它们即将要对某一张表(暂时假定为张三的银行账号)进行扣款(写操作)。 【事务A对应的业务是买手表,事务B对应的业务是买U盘】 0点时,账号存款是100块。两个事务已经一起开启,事务A想扣除50块,事务B想扣除70块,(因为0点时的存款是100,它们的操作都是合法的)。 但是因为某些原因,事务B延迟了,事务A首先扣除了50块,然后事务A提交了,账号的存款余额为50块,事务A扣款成功后,通知商家发货将手表送出,但此时事务B未进行。 紧接着,事务B终于开始对该账号扣除70块钱操作了,但此时存款余额已经不足以扣除70块,导致了事务回滚,事务B执行失败。存款余额回到0点,变回100块。 但刚刚的事务A已经提交了,也成功了,商家已经发货将手表送出了。而张三的账号还是100块,这就造成事务A扣除了(实际未被扣除的)50块。 这就是脏写,即“写了白写”。 2,脏读,简单地讲

数据库:存储引擎+InnoDB+TokuDB+ MyIASM +Memory+索引+三范式等

余生长醉 提交于 2020-01-06 20:11:10
存储引擎 概念 数据库存储引擎是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建、查询、更新和删除数据。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同的存储引擎,还可以 获得特定的功能。现在许多不同的数据库管理系统都支持多种不同的数据引擎。 存储引擎主要有: 1. MyIsam , 2. InnoDB, 3. Memory, 4. Archive, 5. Federated 。 InnoDB(B+树) InnoDB 底层存储结构为B+树, B树的每个节点对应innodb的一个page,page大小是固定的,一般设为 16k。其中非叶子节点只有键值,叶子节点包含完成数据。 数据库:存储引擎+InnoDB+TokuDB+ MyIASM +Memory+索引+三范式等 适用场景 : 1)经常更新的表,适合处理多重并发的更新请求。 2)支持事务。 3)可以从灾难中恢复(通过 bin-log 日志等)。 4)外键约束。只有他支持外键。 5)支持自动增加列属性 auto_increment。 TokuDB(Fractal Tree-节点带数据) TokuDB 底层存储结构为 Fractal Tree,Fractal Tree 的结构与 B+树有些类似, 在 Fractal Tree中,每一个 child 指针除了需要指向一个 child 节点外