并发时能看见什么

并发事务可能交错读取和修改同一批数据。隔离规则决定一个查询能否看到别人的未提交修改,以及同一事务再次读取时,是否允许观察到其他事务后来提交的变化。

脏读、不可重复读、幻读和串行化异常描述不同现象。只禁止脏读,并不意味着两次统计得到同一结果;一组查询保持稳定,也还不必然代表所有并发更新等价于某个串行顺序。

参考:[1]

快照的起点会改变结果

PostgreSQL的Read Committed通常为每条普通SELECT取得语句开始时的已提交快照,因此同一事务里的两次查询可能不同。其Repeatable Read则使用事务第一次非事务控制语句开始时的快照。

同名级别也需结合实现理解。PostgreSQL把Read Uncommitted按Read Committed执行,Repeatable Read还排除了标准最低要求允许的幻读;不能把某一产品的行为直接套给所有数据库。

参考:[1]

隔离仍需协调冲突

多版本并发控制可让读者继续使用旧版本,而锁及冲突检测协调不能同时接受的写入。SQLite的WAL模式允许读者与一个写者并行,但读快照不能任意升级成对过期状态的成功写入。

更强保证往往伴随等待、检查或重试。应用应把可能撤销的事务结果视为暂定,在成功提交后再依赖它;隔离是执行语义的选择,不能只根据“用了事务”四个字判断。

参考:[2] [1]