个人主页:SueWakeup
系列专栏:学习技术栈
个性签名:保留赤子之心也许是种幸运吧
目录
注:手机端浏览本文章可能会出现 “目录”无法有效展示的情况,请谅解,点击侧栏目录进行跳转
本系列专栏
1. 什么是事务
- 事务是数据库的一种特性,用于确保一个执行过程中所有步骤全部成功或者全部失败,是数据库操作的最小执行单元
2. 事务的特征
原子性(Atomicity)
事务是数据库的最小执行单元,事务的原子性确保数据库操作过程中的所有步骤全部成功或者全部失败
一致性(Consistency)
数据修改前和修改后的状态保持一致
隔离性(Isolation)
一个事务的执行不会被其他事务干扰,一个事务内部的操作和使用的数据,在并发中对其他事务是隔离的
持久性(Durability)
事务一旦被提交,将对数据库中的数据的改变是永久性的
3. MySQL实现事务的步骤
3.1 关闭事务自动提交
set autocommit=0;
3.2 开启一个事务,标记事务的起始点
start transaction;
3.3 向数据库提交事务
commit;
3.4 将事务回滚,所有数据库操作被取消
rollback;
3.5 开启mysql自动提交
set autocommit=1;
4. 数据库事务的实现原理
MySQL InnoDB
引擎使用redo log
(重做日志)保证事务的的持久性,使用undo log
(回滚日志)来保证事务的原子性- redo log 是
InnoDB
存储引擎层的日志,又称重做日志文件,用于记录事务操作的变化,记录的是数据修改之后的值。当MySQL
意外宕机,InnoDB
存储引擎会使用redo log
恢复,以此来确保数据的持久性 undo log
保存了事务发生之前的数据的一个版本,用于回滚
- redo log 是
MySQL InnoDB
引擎通过锁机制、MVCC(多版本并发控制)等手段保证事务的隔离性- 保证了事务的持久性、原子性、隔离性之后,一致性才能得到保障
5. 什么是 MVCC?
MVCC
是行级锁的一个变种,在很多情况下避免了加锁情况,开销更低。- 大多数的
MVCC
都实现了非阻塞的读操作,写操作也只锁定必要的行; MVCC
是一种用来解决读-写
冲突的并发控制,为事务分配单向增长的时间戳,为每个修改保存一个版本,每个事务都有一个对应版本的快照,快照版本按照单向增长的时间戳来决定先后顺序- 读操作,只需要读该事务开始前的数据库快照,并不去读取正在修改的数据,仅读取事务开始前的最新版本
6. 数据库并发事务,会带来哪些问题?
脏读
一个事务正在访问数据并且对数据进行了修改,而修改操作还没提交到数据库中,这时另外一个事务也访问这个数据,然后使用这个数据。由于这个数据是没有提交的数据,那么另外一个事务读到的这个数据就是“脏数据”
不可重复读
一个事务内多次读同一个数据,在这个事务还没结束时,另外一个事务也访问该数据,在第一个事务中的两次读数据之间,由于第二个事务的修改导致第一个事务读取到的数据可能不一致,这就发生了在一个事务内两次读到的数据是不一致的情况,所以称为不可重复读
丢失修改
一个事务读取一个数据时,另外一个事务也访问这个数据,在第一个事务修改这个数据后,第二个事务也修改了这个数据导致第一个事务的修改丢失
幻读
与不可重复读类似,在第一个事务读取了几行数据,另一个事务插入了一些数据,在随后的查询中,第一个事务发现多了一些原本不存在的记录
7. 不可重复读和幻读的区别
- 不可重复读的重点是修改,多次读取一条记录,发现其中某些列的值被修改
- 幻读的重点在于新增或删除,比如多次读取某条件下的记录,发现记录增多或减少
8. 事务的隔离级别
读未提交
最低的隔离级别,允许读取尚未提交的数据变更,可能导致 脏读、幻读或不可重复读
读已提交
允许读取并发事务已经提交的数据,可以阻止脏读
可重复读
对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读
可串行化
最高的隔离级别,完全服从 ACID 的隔离级别,所有的事务依次逐个执行,防止事务之间产生干扰,可阻止脏读、不可重复度以及幻读