我们知道数据库事务保证 ACID(原子性、一致性、隔离性、持久性)。 SQL 提供了 Read Uncommitted Isolation Level,通过这个级别的设置,reader 可以在事务中读取脏数据,如果事务回滚,脏数据可能会被丢弃。
但我认为,这种行为也违反了原子性。
说,我们有
a = 0
b = 0
会话 A 执行事务:
begin
set a = 1
// continues...
另一个会话 B 从数据库中读取:
get a, b => a=1, b=0
会话 A 继续
set b = 2
commit
读过程读出(a=1, b=0),这不是违反原子性吗?我只期望 (a=0, b=0) 或 (a=1, b=2) 会满足原子性,永远不会 (a=0, b=2) 或 (a=1, b=0)。>