数据库的隔离级别能以这种角度概括全么?

(一)事务 A 发生了,其它事务一个都别想发生。
(二)事务 A 发生了,可以再有其它事务并行发生,但是事务 A 涉及到的记录,其它事务不许读也不许写。
(三)事务 A 发生了,可以再有其它事务并行发生,但是事务 A 涉及到的记录,其它事务不许写,但可以读。
(四)事务 A 发生了,可以再有其它事务并行发生,但是事务 A 涉及到的记录,其它事务可以写,也可以读。

第一显然是 强制串行化 serializable
第四显然是 读未提交 read uncommited
不过第二第三,我就不太确定。第二对应 读已提交 read commited,第三对应 可重复读 repeatable read ?

因为读已提交和可重复读这两个概念真的让我头大无比,我觉得从我这样的角度去想更清晰明了不是么?

谢谢。

阅读 2.3k
3 个回答

1.不要用模糊的模棱两可的语言去描述一个经过比较严格的定义的概念,事务的隔离级别只给出了不同事务读写(把创建和删除理解为广义上的写操作,或者说这里的读写代表了未修改/修改了访问数据源的状态)应该达到的要求,而没有限制达到要求使用的技术,MVCC多版本并发控制也可以实现其中的某些隔离级别,可它并没有向你理解的那样限制读或者写。
2.四种隔离级别都必须满足的条件是不能脏写,即使是读未提交(读未提交的问题是脏读),但你的理解第四个显然会导致脏写。
3.可串行化隔离级别并不意味着必须完全串行调度。

请看《数据库系统概念》第六版

你这个不是全不全的问题,而是对不对的问题。如果你想简单的总结一下4个隔离级别,可以这样:

  • 读到了未提交的数据(脏读) —— 读未提交
  • 读到了提交的数据(不可重复读) —— 读已提交
  • 读到了插入的数据(幻读) —— 可重复读
  • 读数据时不允许其它事务操作 —— 串行化

关于读已提交和可重复读,你可以这样理解,读已提交读到的都是数据库最新的值,而可重复读读到的是事务开启时的值,事务执行过程中有别的事务提交数据,它是读不到的(即可重复读)。

赞同xvusrmqj说的,你概括的角度真的是对不对的问题,事务关注点应该是数据读写,或者说是数据被写入以后的读(可能是已提交,也可能是未提交),而不是你描述的事务的并发,最精炼的概括就是:

  • 读未提交
  • 读已提交
  • 可重复读
  • 串行化

你可以看下这个深入学习MySQL事务:ACID特性的实现原理

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题