我刚读了RDBMS, 并且RDBMS的一个属性是 原子。所以,如果钱被撤回 从一个帐户转移到 另一个,要么是交易 将完全发生或不发生 一点都不没有偏袒 交易。但实际上是怎样的 确保?
针对上述场景的SQL查询
可能看起来像
(i)更新accounts
设定余额=余额 - 金额WHERE ac_num = 101
(ii)更新accounts
设定余额=余额+金额WHERE ac_num = 102
这绝不是确保原子性的.. 那它究竟是怎么发生的?
答案 0 :(得分:5)
如果你这样做
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中更新但未提交的数据。 (这里的锁定基本上只是一个注释“我在这里工作,不要碰。”)
答案 1 :(得分:2)
要成为原子,交易需要:
第一个是由事务在执行期间读取或写入的locking行实现的。
完成第二个操作,以便事务将其操作写入transaction log。这使得即使服务器在事务期间断电,数据库也能够恢复。在这种情况下,恢复过程将读取日志,确保中止活动(非公用)事务并取消它们所做的更改。