Mysql事务隔离级别

Mysql事务隔离级别

假如你从Mysql设计师的角度看,在事务处理中可能会出现下面几种问题:
1.更新丢失

A、B线程并发修改同一条数据,A修改成功并提交,B回滚了修改,这种情况那么也会把A提交的结果也回滚了。A更新的内容就丢失了。(使用悲观锁for update,或乐观锁解决)

2.脏读

A、B线程并发修改同一条数据,A修改后未提交,B此时读会就会读到A提交前的数据,A也可能会回滚导致B结果错误。

3.不可重复读

A、B线程并发修改同一条数据,AB同时读数据,A修改后提交,B再去读会读到两个个不同的结果。

4.幻读

A、B线程并发修改同一条数据,A添加或者删除并提交了数据,B在A提交前和提交后读到了不同的行数的数据。

正因为如此,设计师在数据上设计了4中事务隔离级别,数据库默认隔离级别是可重复度,读已提交,可重复读使用了MVCC实现。而幻读可以使用间隙锁解决。

脏读 不可重复读 幻读 锁机制
读未提交(read-uncommitted) YES YES YES A事务加X锁,禁止其他事务修改
读已提交(read-commmitted) NO YES YES B读取加S锁,A只能再B读完才能修改
可重复读(repeatable) NO NO YES B事务加S锁,A只能在B事务结束才能修改
可串行化(serializable) NO NO NO A加S锁,B加表级X锁

共享锁(S):select ... lock in share mode

排他锁(X):select ... for update