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