我刚刚读到有关 RDBMS 的内容, RDBMS 的一个属性是 原子性。那么如果钱被提取 从帐户转入 另一个,要么是交易 是否会完全发生 根本不。没有部分的 交易。但实际情况如何 有保证吗?
上述场景的Sql查询 可能看起来像 (i) 更新
accounts
设置余额 = 余额 - 金额 WHERE ac_num = 101
(ii) 更新 accounts
设置余额 = 余额 + 金额 WHERE ac_num = 102
这绝不保证原子性.. 那么它实际上是如何发生的呢?
如果你这样做
BEGIN TRANSACTION
UPDATE accounts set balance = balance - amount WHERE ac_num = 101
UPDATE accounts set balance = balance + amount WHERE ac_num = 102
COMMIT TRANSACTION
数据库系统将记录对帐户 101 所做的更改。然后,如果帐户 102 上的工作失败,RDBMS 将使用这些记录来撤消对 101 进行的工作。
此外,当它开始对帐户 101 进行工作时,它会锁定数据库,以便其他人无法读取帐户 101 中已更新但未提交的数据。 (这里的锁基本上只是某处的注释“我在这里工作,请勿触摸。”)