读-未提交
- 读数据时,会读到未成功提交的数据(未防止“脏读”)
- 写数据时,只会覆盖已成功提交的数据(防止“脏写”)
读-提交
- 读数据时,只会读到已成功提交的数据(防止“脏读”)
- 写数据时,只会覆盖已成功提交的数据(防止“脏写”)
防止脏写
通常通过推迟第二个写请求(行锁),直到前面的事务完成提交(或者终止)。
防止脏读
通过行锁同样可以避免脏读,但是实际中不可行(性能太差),一般采用类似 MVCC 的方式:对于待更新的对象,数据库都会维护其旧值和当前持锁事务将要设置的新值两个版本。 事务提交之前,其他所有读操作读旧值;仅当写事务提交之后,才会切换到读取新值。
可重复读(快照级别隔离)
在同一个事务中,反复读取总能获得一致性的结果,而不会读取到其他事务提交修改的新值。总体性想法是:每个事务都从数据库的一致性快照中读取,事务一开始所看到的是最近提交的数据,即使数据随后可能被另外一个事务更改,但保证每个事务都只看到特定时间点的旧数据。