MySQL 事务四大隔离级别

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):

串行化利用加锁的方式,在这个事务没有被提交之前其他的线程,只能等到当前操作完成之后,才能进行操作,这样会非常耗时,而且,影响数据库的性能,通常情况下,不会使用这种隔离级别。但是这种方式解决了幻读的问题。

相关推荐