我刚读到关于RDBMS的文章,RDBMS的一个属性是原子性。因此,如果从一个账户中提取资金并转移到另一个账户,交易要么完全发生,要么根本不发生。不存在部分事务。但实际上如何保证呢?
上述场景的accounts查询可能如下所示:(i) UPDATE set = balance - amount WHERE ac_num = 101 (ii) UPDATE accounts set balance = balance + amount WHERE ac_num = 102
这并不能保证原子性..那么它到底是如何发生的呢?
发布于 2009-03-28 10:25:58
如果你这样做了
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中已更新但未提交的数据。(这里的锁基本上只是一个注释,“我在这里工作,不要碰”。)
发布于 2009-03-28 11:58:10
要实现原子性,事务需要:
第一个是通过事务在执行期间读取或写入的locking行来实现的。
第二个是完成的,以便事务将它们的操作写入到transaction log中。这使得数据库即使在事务期间服务器断电的情况下也能够恢复。在这种情况下,恢复过程将读取日志,确保中止活动(未提交)事务,并取消它们所做的更改。
https://stackoverflow.com/questions/692544
复制相似问题