保证sql的原子性

问题描述 投票:0回答:2

我刚刚读到有关 RDBMS 的内容, RDBMS 的一个属性是 原子性。那么如果钱被提取 从帐户转入 另一个,要么是交易 是否会完全发生 根本不。没有部分的 交易。但实际情况如何 有保证吗?

上述场景的Sql查询 可能看起来像 (i) 更新

accounts
设置余额 = 余额 - 金额 WHERE ac_num = 101 (ii) 更新
accounts
设置余额 = 余额 + 金额 WHERE ac_num = 102

这绝不保证原子性.. 那么它实际上是如何发生的呢?

sql transactions
2个回答
8
投票

如果你这样做

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 中已更新但未提交的数据。 (这里的锁基本上只是某处的注释“我在这里工作,请勿触摸。”)


4
投票

为了实现原子性,交易需要:

  • 防止其他事务干扰它们正在写入或读取的行
  • 确保事务提交时,事务所做的全部更改或全部更改都不存在于数据库中。

第一个是通过锁定事务在执行期间读取或写入的行来实现的。

完成第二个操作,以便事务将其操作写入事务日志。这使得即使服务器在事务期间断电,数据库也能够恢复。在这种情况下,恢复过程将读取日志,确保活动(未提交)事务被中止并取消它们所做的更改。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.