我正在阅读dbms的ACID属性,其中1个属性是原子性。
http://ecomputernotes.com/database-system/rdbms/transaction
场景:
假设,就在交易Ti执行之前,账户A和B的值是Rs. I000和Rs.2000。
现在,假设在Ti的执行过程中,发生了电源故障,阻止了Ti成功完成。故障点可能在完成写入(A,a)之后和写入(B,b)之前。这意味着在A中执行了更改,但在B中没有执行。因此,帐户A的值分别为950卢比和2000卢比。由于这次故障,我们损失了50卢比。
现在,我们的数据库处于不一致状态。
我的问题是,如果停电导致我们处于不一致状态,我们如何从中恢复?
我们可以在应用程序级别/代码级别进行吗?
有多少种方法可以从中恢复?
一般来说,这些方式可能因数据库而异,但通常DBMS以这种方式确保原子性:
当收到新的数据更改请求时,数据库首先将此请求写入表示更改向量的特殊日志。只有当这条记录被成功写入时,才能提交事务。
在断电的情况下,此日志会持续存在。并且数据库可以使用此日志从不一致状态中恢复,逐个应用更改。
例如,这个日志在Oracle数据库中称为重做日志。在PostgreSql中,它被称为WAL。