当数据库开始一个事务时,在该事务中执行的所有语句都是隔离的,并且是原子的(并且是一致的和持久的)。这些都是事务的定义。
维基百科指出,有些数据库通过锁定行来确保事务保持隔离,并且在事务提交之前不对它们进行解锁。
我的问题是:一个完全依赖锁的数据库如何保证一致性?如果在事务处理过程中发生停电,可能会部分写入行中的数据。
即使对于使用临时DB执行所有事务的数据库(如Server ),如果数据库将事务提交到磁盘时发生停电怎么办?
数据是否已损坏或数据库是否正确处理?
发布于 2011-08-11 23:28:45
请原谅我,这是一个复杂的问题来澄清,我们可能会通过几轮编辑和评论来填补空白。从你问题的措辞来看,我猜你并没有区分酸的原子性、隔离性、一致性和耐久性。
当数据库开始一个事务时,在该事务中执行的所有语句都是隔离的,并且是原子的(并且是一致的和持久的)。这些都是事务的定义。
酸的隔离部分被广泛误解。事务之间有一定程度的隔离,这取决于事务隔离级别。酸的其他元素是绝对的。
Wikipedia声明,有些数据库通过锁定行和在事务提交之前不解锁来确保事务保持隔离。
这与酸的隔离部分有关,它对你的主要问题没有任何影响。
我的问题是:一个完全依赖锁的数据库如何保证一致性?如果在事务处理过程中发生停电,可能会部分写入行中的数据。
您的示例与一致性无关,它具有持久性和原子性。这是由预写测井 (WAL)提供的。使用WAL时,所有更改在应用于数据之前都会写入撤消/重做日志。
在发生电源故障时,将运行一个恢复过程,它将读取日志以标识( a)未提交的“中间”事务,以及( b)确实提交但未应用于数据的事务。从a)事务的更改被撤消(回滚),将数据返回到其事务前状态。对b)的更改将被重做(前滚),确保数据处于预期的事务后状态。
即使对于使用临时DB执行所有事务的数据库(如Server ),如果数据库将事务提交到磁盘时发生停电怎么办?
TempDB (假设这就是您所指的)与Servers执行事务完全无关。您是否混淆了TempDB在快照隔离级别中的作用?
https://dba.stackexchange.com/questions/4574
复制相似问题