dbms 如何在事务期间保持原子性?
Posted
技术标签:
【中文标题】dbms 如何在事务期间保持原子性?【英文标题】:How does dbms maintain atomicity during transactions? 【发布时间】:2019-12-04 11:28:24 【问题描述】:我正在阅读 dbms 的 ACID 属性,其中 1 个属性是 原子性。
http://ecomputernotes.com/database-system/rdbms/transaction
场景:
假设,就在交易 Ti 执行之前,账户 A 和 B 的值为 Rs.I000 和 Rs.2000。
现在,假设在 Ti 的执行过程中,发生了电源故障,导致 Ti 无法成功完成。失败点可能在完成 Write (A,a) 之后和 Write(B,b) 之前。这意味着在 A 中执行了更改,但在 B 中没有执行。因此帐户 A 和裸 Rs.950 和 Rs.2000 的值分别。由于这次失败,我们损失了 50 卢比。
现在,我们的数据库处于不一致状态。
我的问题是,如果电源故障导致我们进入不一致的状态,我们如何从中恢复?
我们可以在应用程序级别/代码级别进行吗?
有多少种方法可以从中恢复?
【问题讨论】:
您是在询问一些特定的数据库,还是一般性的?因为这些方式和算法可能因供应商而异。 一般来说,不想了解算法。例如:Q 是如果发生电源故障并且从 1 个帐户中扣除了金额,他们如何才能将其恢复到一致状态,即在帐户 2 中存入金额? 【参考方案1】:一般来说,这些方式可能因数据库而异,但通常 DBMS 以这种方式确保原子性:
当接收到新的数据更改请求时,数据库首先将此请求写入表示更改向量的特殊日志。只有当这条记录写入成功后,才能提交事务。
如果发生电源故障,此日志将继续存在。并且数据库可以使用此日志从不一致的状态中恢复,并一一应用更改。
例如,Oracle 数据库中的此日志称为Redo Log。在 PostgreSql 中它被称为WAL。
【讨论】:
以上是关于dbms 如何在事务期间保持原子性?的主要内容,如果未能解决你的问题,请参考以下文章