事务性质
事务有四大特性(ACID):
- 原子性(Atomicity): 事务作为一个整体被执行,要么全部执行,要么全不执行。
- 一致性(Consistency): 指在事务开始之前和事务结束以后,数据不会被破坏。
- 隔离性(Isolation): 多个事务并发访问时,事务之间是相互隔离的,一个事务不应该被其他事务干扰,多个并发事务之间要相互隔离。
- 持久性(Durability): 表示事务完成提交后,该事务对数据库所做的更改操作,将持久地保存在数据库之中。
并发场景的问题
MySQL 在并发场景三大问题:脏读、不可重复读和幻读。
脏读:事务 A、B 交替执行,事务 A 读取到了事务B未提交的数据,即为脏读。
不可重复读:A、B 两事务,事务 A 范围内,两次查询相同数据,受到事务 B 的影响,读取数据不一致。
幻读:A、B 两事务,A事务的两次查询期间,B 新增/删除事务提交了,导致两次查询得到的记录数量不同。
四大隔离级别
MySQL 有四大事务等级:读未提交,读已提交,可重复读和串行化。
读未提交(Read Uncommited):最低级的事务等级,有脏读的问题。
读已提交(Read Commited):会出现不可重复读的问题。
可重复读(Repeatable Read):解决不可重复读问题,极大程度解决了幻读的问题,但在一定场景下仍然出现幻读。
串行化(Serializable):最高等级事务,重量级。读写互斥。
读未提交:可以读取到其他事务未提交的数据,出现脏读问题。
读已提交:事务 A 期间能够读取到事务 B 提交的数据,出现不可重复读问题。
可重复读:还会有一定的幻读问题。
但在事务 A 期间,事务 B 进行新增操作,事务 A 又恰巧更新了该条记录,出现幻读。
串行化:读写互斥。