我刚刚阅读有关RDBMS的内容,而RDBMS的一个属性是原子性.因此,如果从账户中提取资金并转移到另一个账户,则交易将完全发生或根本不发生.没有部分交易.但实际上如何确保?
上述场景的SQL查询可能看起来像(i)UPDATE accounts
set balance = balance - amount WHERE ac_num = 101(ii)UPDATE accounts
set balance = balance + amount 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中更新但未提交的数据.(此处的锁定基本上只是一个注释"我在这里工作,不要碰.")