MySQL 事务四大隔离级别
事务的四大特性:
原子性(Atomicity):事务作为一个整体被执行,包含在其中的对数据库的操作要么全部都执行,要么都不执行。
一致性(Consistency): 指在事务开始之前和事务结束以后,数据不会被破坏,假如A账户给B账户转10块钱,不管成功与否,A和B的总金额是不变的。
隔离性(Isolation):多个事务并发访问时,事务之间是相互隔离的,一个事务不应该被其他事务干扰,多个并发事务之间要相互隔离。
持久性(Durability):表示事务完成提交后,该事务对数据库所作的操作更改,将持久地保存在数据库之中。
事务的并发问题:
脏读(dirty read):
事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据
不可重复读(unrepeatable read):
事务 A多次读取同一数据,事务 B在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果不一致。(重点在于修改,满足条件的数据)
幻读:
事务A查询公司年龄大于35岁的员工,结果10个人,事务B插入一条年龄40岁的员工信息,事务A在执行相同的查询得到了11个人 ,就好像发生了幻觉一样,这就叫幻读。(重点在于新增删除,范围条件)
MySQL事务隔离级别:
事务隔离级别 | 脏读 | 不可重复度 | 幻读 |
读未提交(read-uncommitted) | 是 | 是 | 是 |
不可重复读(read-committed) | 否 | 是 | 是 |
可重复读(repeatable-read) | 否 | 否 | 是 |
串行化(serializable) | 否 | 否 | 否 |
Serializable (串行化):可避免脏读、不可重复读、幻读的发生 。
Repeatable read (可重复读):可避免脏读、不可重复读的发生 。
Read committed (读已提交):可避免脏读的发生 。
Read uncommitted (读未提交):最低级别,任何情况都无法保证。
读未提交(Read Uncommitted):
客户端A可以读取到客户端B修改后但未提交的数据,一旦客户端B的事务因为某种原因回滚,所有的操作都将会被撤销,那客户端A查询到的数据其实就是脏数据。
不可重复度【已提交读】(Read Committed):
客户端B的事务还没提交,客户端A不能查询到B已经更新的数据,解决了脏读问题,但是客户端A执行与上一步相同的查询,结果与上一步不一致,即产生了不可重复读的问题。
可重复读(Repeatable Read):
客户端A在查询过程中,客户端B有数据修改并提交事务,客户端A再查询和上一步结果相同,解决了不可重复读的问题,但是还会存在幻读的问题。比如客户端A查询时没有id为1的数据,此时客户端B向表中插入一条数据id为1并提交,这时客户端A任然以位数据库中没有id为1的数据,于是插入一条id为1的数据,结果报错了,就发生了幻读的问题。
串行化(Serializable):
串行化利用加锁的方式,在这个事务没有被提交之前其他的线程,只能等到当前操作完成之后,才能进行操作,这样会非常耗时,而且,影响数据库的性能,通常情况下,不会使用这种隔离级别。但是这种方式解决了幻读的问题。