MySQL 事务的隔离级别以及脏读、幻读和不可重复读
1 事务的四大特性 ACID
ACID,是指数据库管理系统(DBMS)在写入或更新的过程中,为保证事务(transaction)是正确可靠的,所必须具备的四个特性:原子性(atomicity)、一致性(consistency)、隔离性(isolation)、持久性(durability)。
Atomicity(原子性):一个事务中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被恢复到事务开始前的状态,就像这个事务从来没有执行过一样。
Consistency(一致性):在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。
Isolation(隔离性):数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。
Durability(持久性):事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
2 事务的四种隔离级别
查看数据库的隔离级别
设置数据库的隔离级别
隔离级别可选项:
read uncommitted
read committed
repeatable read
serializable
2.1 读未提交(read-uncommitted)
在该隔离级别,所有的事务都可以看到其他事务没有提交的执行结果。(生产中不使用)
2.2 读提交(read-committed)
该隔离级别,一个事务只能看到其他的已经提交的事务所做的改变。这种隔离级别也支持不可重复读,即同一个 select 可能得到不同的结果。
2.3 可重复读(repeatable-read)
这是 MySQL 默认的隔离级别,它确保同一个事务在并发读取数据时,会看到同样的数据行。
2.4 串行化(serializable)
这是事务的最高隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决了幻读的问题。它在每个读的数据行上面加上共享锁,。但是可能会导致超时和锁竞争。(生产环境基本不使用)
3 事务的并发问题(脏读、幻读、不可重复读)
3.1 脏读
A 事务读取 B 事务尚未提交的数据,此时如果 B 事务发生错误并执行回滚操作,那么 A 事务读取到的数据就是脏数据。
一则故事描述让你理解什么是脏读:
3.2 幻读
相同的条件查询一些数据,然后其他事务【新增】或者是【删除】了该条件的数据,然后导致读取的结果不一样多。例如事务 A 第一次查询时 student 数量为 2,此时事务 B 新增一个 student,事务 A 再次查询发现莫名其妙多了一个。
理解什么是幻读:
3.3 不可重复读
事务 A 多次读取同一数据,事务 B 在事务 A 多次读取的过程中,对数据作了更新并提交,导致事务 A 多次读取同一数据时,结果不一致。
理解什么是不可重复读:
4 隔离级别与并发问题的关系
版权声明: 本文为 InfoQ 作者【Barry Yan】的原创文章。
原文链接:【http://xie.infoq.cn/article/53711cabb406b40c245479210】。文章转载请联系作者。
评论