【问题标题】:Ensuring Atomicity sql确保原子性 sql
【发布时间】:2009-03-28 10:13:10
【问题描述】:

我只是在阅读有关 RDBMS 的信息, RDBMS 的一个属性是 原子性。所以,如果取款 从一个帐户转移到 另一个,要么交易 会不会完全发生 一点也不。没有偏 交易。但实际上如何 有保证吗?

上述场景的Sql查询 可能看起来像 (i) 更新accounts 设置余额 = 余额 - 金额 WHERE ac_num = 101 (ii) UPDATE accounts set balance = balance + amount WHERE ac_num = 102

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

【问题讨论】:

    标签: sql atomic


    【解决方案1】:

    如果你这样做了

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

    【讨论】:

    • 不,它不会锁定数据库。根据事务隔离模式,通常其他读取数据库的人在提交之前不会看到更新(他们会看到之前的值)。
    • 是的,这取决于事务隔离模式。在现代 RDBMS 中:s 锁定发生在行级别。这种“以前的值”可能会导致不可重复的读取异常。
    【解决方案2】:

    要成为原子的,事务需要:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多