数据库四种隔离级别

数据库四种隔离级别
1 、没锁的情况下,线程修改的数据可能会被并行的线程修改的数据覆盖掉。
数据库四种隔离级别_第1张图片
2、 改进让两个线程更改为串行,加入锁的概念,先称呼为 X 锁(在涉及写的情况,则加入 X 锁)
数据库四种隔离级别_第2张图片
3、 获取脏数据
数据库四种隔离级别_第3张图片
解决这种情况,加入共享锁( Share Lock ),先称呼 S 锁, S 锁与 X 锁(排他锁)是有一定区别的, S 锁主要用来读取数据,如果一个数据加了 X 锁,不允许获取 S 锁。一个数据被加了 S 锁,就无法被 X 锁。 当然 S 锁是针对于读数据,所以在读取完毕以后,立马释放 S 锁。(此处有一点问题,后续解释)
数据库四种隔离级别_第4张图片
4、 数据重复读
数据库四种隔离级别_第5张图片
遵守上诉规则,还是出现了数据不一致性。所以在读的时候,也需要一直锁定,等到事物提交后续释放 S 锁。所以刚红字描述跟这里的有冲突。
数据库四种隔离级别_第6张图片
5、 幻觉出现
数据库四种隔离级别_第7张图片
遇到这种情况,只能出终极大招,就是所有的数据操作,全部串行化。
总结了一下, 分为了这么几种情况:
1. 写数据时加上X锁,直到事务结束, 读的时候不加锁。
虽然能够避免丢失数据, 但是可以读到没有提交或者回滚的内容 (脏数据), 这其实就是数据库最低的事务隔离级别 --- Read uncommitted
2. 写数据的时候加上X锁, 直到事务结束, 读的时候加上S锁, 读完数据立刻释放。
这能避免 “丢失数据”和“脏数据”, 但是会出现“不可重复读”的问题 , 这是第二级的事务隔离级别 -- Read committed
3. 写数据的时候加上X锁, 直到事务结束, 读数据的时候加S锁, 也是直到事务结束。
这能避免 “丢失数据”和“脏数据”, “不可重复读”三个问题 , 这是数据库常用的隔离级别 --
Repeatable read
数据库四种隔离级别_第8张图片

你可能感兴趣的:(mysql)