读-未提交

  • 读数据时,会读到未成功提交的数据(未防止“脏读”)
  • 写数据时,只会覆盖已成功提交的数据(防止“脏写”)

读-提交

  • 读数据时,只会读到已成功提交的数据(防止“脏读”)
  • 写数据时,只会覆盖已成功提交的数据(防止“脏写”)

防止脏写

通常通过推迟第二个写请求(行锁),直到前面的事务完成提交(或者终止)。

防止脏读

通过行锁同样可以避免脏读,但是实际中不可行(性能太差),一般采用类似 MVCC 的方式:对于待更新的对象,数据库都会维护其旧值和当前持锁事务将要设置的新值两个版本。 事务提交之前,其他所有读操作读旧值;仅当写事务提交之后,才会切换到读取新值。

可重复读(快照级别隔离)

在同一个事务中,反复读取总能获得一致性的结果,而不会读取到其他事务提交修改的新值。总体性想法是:每个事务都从数据库的一致性快照中读取,事务一开始所看到的是最近提交的数据,即使数据随后可能被另外一个事务更改,但保证每个事务都只看到特定时间点的旧数据。

实现快照级别隔离

MVCC

串行化