如果交易是“已提交”的,那么可以确定将其保存吗?


12

如果事务成功提交,那么我能否100%确保已将其写入数据库和日志文件?我可以确定数据已保存吗?

今天,我们的日志文件已达到驱动器的极限,并且出现了很多错误。此外,其他一些服务崩溃了。我们增加了磁盘并重新启动了服务器。

在启动过程中,服务器进行了“数据库恢复”-我可以确定一切都还好吗?


2
恢复完成后,您可以检查错误日志,以查看已提交的事务数和已回滚的事务数。对此没有万能的答案-如果磁盘崩溃了,那一切都取决于当时的事务状态。
亚伦·伯特兰

1
@AaronBertrand但是,如果事务处于“已提交”状态(即,提交成功),那么在恢复过程中又怎么会丢失它呢?
SQL警察

3
@Giosco:不能。“ committed”表示它在数据库的日志文件中。此后丢失它的唯一方法是:1)在将日志文件也保存到数据文件之前丢失日志文件,或2)丢失日志文件和数据文件,或者3)人为错误。注意,(3)通常是最可能的。
RBarryYoung

2
@Giosco您如何知道已成功完成整个驱动器中的所有交易?
亚伦·伯特兰

2
存储过程<>事务-您的存储过程可以有多个显式事务,也可以只有隐式事务,可以有try / catch逻辑,可以在C#层进行事务处理,依此类推。等等。再次,假设没有异常=成功提交笼统地说可能有点太危险了。
亚伦·伯特兰

Answers:


16

如果客户端应用程序已发出COMMIT并获取了成功代码,则引擎将确保事务是持久的。保证即使在崩溃之后,事务中完成的所有更改都将是可见的。此外,恢复还保证了在崩溃的情况下任何未提交的事务都将被回滚。

有关更多详细信息,我建议阅读ARIES论文。

如果基础存储硬件有故障(损坏),则预写日志记录和恢复无法保证。并且任何工程产品都可能包含缺陷。

与所有其他应用程序一样,您的应用程序需要仔细编写才能在出现崩溃(错误)时正确运行。没有魔术。


如果客户端应用程序已发出COMMIT,但是直到客户端超时,都未收到DB的响应。那这个提交呢?成功还是失败?怎么检查?
Gab是好人
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.