故障期间的事务和数据一致性

Ric*_*ard 7 transaction database-theory

当数据库开始一个事务时,在该事务中执行的所有语句都是孤立的和原子的(一致和持久的)。这些几乎是交易的定义。

维基百科指出,有一些数据库通过锁定行并在事务提交之前不解锁它们来确保事务保持隔离。

我的问题是:完全依赖锁的数据库如何保证一致性?如果在事务中间发生断电,则可能会有部分数据写入该行。

即使对于像 SQL Server 这样使用临时数据库来执行所有事务的数据库,如果在数据库将事务提交到磁盘时发生断电,会发生什么?

数据是否已损坏或数据库是否正确处理?

Mar*_*ith 13

请耐心等待,这是一个需要澄清的复杂问题,我们可能会通过几轮编辑和评论来填补空白。从你的问题的表述方式来看,我猜你没有区分 ACID 的原子性、隔离性、一致性和持久性元素。

当数据库开始一个事务时,在该事务中执行的所有语句都是孤立的和原子的(一致和持久的)。这些几乎是交易的定义。

ACID 的隔离部分被广泛误解。事务之间存在一定程度的隔离,这取决于事务隔离级别。ACID 的其他元素是绝对的。

维基百科指出,有一些数据库通过锁定行并在事务提交之前不解锁它们来确保事务保持隔离。

这与 ACID 的隔离部分有关,它对您的主要问题没有任何影响。

我的问题是:完全依赖锁的数据库如何保证一致性?如果在事务中间发生断电,则可能会有部分数据写入该行。

您的示例与一致性无关,而是持久性和原子性。这些由预写日志(WAL)保证。使用 WAL,所有更改在应用于数据之前都会写入撤消/重做日志。

如果发生电源故障,将运行恢复过程,该过程将读取日志以识别 a) 未提交的“中途”事务和 b) 已提交但未应用于数据的事务。a) 事务中的更改被撤消(回滚),将数据返回到其事务前状态。b) 中的更改被重做(前滚),确保数据处于预期的交易后状态。

即使对于像 SQL Server 这样使用临时数据库来执行所有事务的数据库,如果在数据库将事务提交到磁盘时发生断电,会发生什么?

TempDB(假设这就是您所指的)与 SQL Server 的事务执行完全无关。您是否混淆了 TempDB 在快照隔离级别中的作用?