前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >System|数据库|Isolation

System|数据库|Isolation

作者头像
朝闻君
发布2021-11-22 10:36:45
2050
发布2021-11-22 10:36:45
举报
文章被收录于专栏:用户9199536的专栏

Reference A critique of ANSI SQL isolation levels

ANSI SQL92定义了四种隔离级别,Berensen在其基础上提出应该定义额外的隔离级别,Cursor Stability和Snapshot Isolation,并且定义了三种异常。

这里需要注意数据库实现的隔离级别并不对应着理论上的隔离级别。

异常

P0-脏写

如果T2修改了T1写的数据,那么T2回滚到原状态后T1的写就丢失了

(T1写了脏数据,被回滚了)

P1-脏读

T2未提交的数据被T1读取,如果回滚则T1读到不存在的数据

(T1读了脏数据,被回滚了) P4-丢失更新

T2的写覆盖了T1的写,使得T1提交的写丢失了

例如: 其实就是写冲突,和不可重复读差不多,都是被插入了写。

P2-不可重复读

T2提交后T1读的数据项,和T2提交前T1读的数据项不同

例如: 第一次查询为0,第二次查询为1

P3-幻读

T2提交后T1读的数据集,和T2提交前T1读的数据集不同

例如: 第一次查询无结果,第二次查询有结果

A5A-读偏斜

存在约束的数据项,T1先读某项并且T2修改提交后,T1对另一项读取,此时不满足约束

例如: x==y的约束,读取x=100,但是x中间被修改为150,读取y=150,此时x!=y

A5B-写偏斜

存在约束的数据项,T2对某项修改提交后,T1对另一项修改,此时不满足约束。

例如: x+y<=101,x=50,y=50,两者分别++均能满足约束,但是合并后无法满足。由于快照隔离时写其他事务的写对于当前事务不可见而导致。

隔离等级

游标稳定(避免游标导致的部分lost update)

  • 对读的游标加锁直到游标移开或关闭(如果所有事务共用游标)
  • 游标读的数据稳定,不同事务使用不同游标, 防止插入当前行的写。

不用游标访问数据的时候就不生效了

快照隔离(无法避免predicate read导致的幻读)

因为使用MVCC,所以比串行化性能高很多,同时也有不错的隔离性

事务所能读取到的数据版本应当是事务开始时,开始之后其他事务的写对于当前事务不可见。

串行化快照隔离(避免Write Skew)

Reference https://zhuanlan.zhihu.com/p/103553619?utm_source=wechat_session Reference https://dl.acm.org/doi/10.1145/1376616.1376690

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 异常
  • 隔离等级
  • 串行化快照隔离(避免Write Skew)
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档