MySQL事务的隔离级别以及脏读、幻读和不可重复读
1 事务的四大特性ACID
ACID,是指数据库管理系统(DBMS)在写入或更新的过程中,为保证事务(transaction)是正确可靠的,所必须具备的四个特性:原子性(atomicity)、一致性(consistency)、隔离性(isolation)、持久性(durability)。
- Atomicity(原子性):一个事务中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被恢复到事务开始前的状态,就像这个事务从来没有执行过一样。
- Consistency(一致性):在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。
- Isolation(隔离性):数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。
- Durability(持久性):事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
2 事务的四种隔离级别
查看数据库的隔离级别
show variables like '%isolation%'
设置数据库的隔离级别
set session transaction isolation level [隔离级别];
隔离级别可选项:
- 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 隔离级别与并发问题的关系
事务隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
读未提交(read-uncommitted) | 是 | 是 | 是 |
读提交(read-committed) | 否 | 是 | 是 |
可重复读(repeatable-read) | 否 | 否 | 是 |
串行化(serializable) | 否 | 否 | 否 |
- 点赞
- 收藏
- 关注作者
评论(0)