确保原子性sql

时间:2009-03-28 10:13:11

标签: sql atomicity

我刚读了RDBMS, 并且RDBMS的一个属性是 原子。所以,如果钱被撤回 从一个帐户转移到 另一个,要么是交易 将完全发生或不发生 一点都不没有偏袒 交易。但实际上是怎样的 确保?

针对上述场景的SQL查询 可能看起来像 (i)更新accounts设定余额=余额 - 金额WHERE ac_num = 101 (ii)更新accounts设定余额=余额+金额WHERE ac_num = 102

这绝不是确保原子性的.. 那它究竟是怎么发生的?

2 个答案:

答案 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。这使得即使服务器在事务期间断电,数据库也能够恢复。在这种情况下,恢复过程将读取日志,确保中止活动(非公用)事务并取消它们所做的更改。