从耐用性
一旦用户发出提交命令,则首先将事务写入存储在诸如硬盘之类的非易失性介质上的数据库文件中,这是在向用户确认已发生保存之前完成的。如果数据库在保存之前崩溃,则下次重新启动数据库时数据仍在事务日志中,但任何未提交的更改都将撤消或回滚。
- 说我开始交易
- 触发第一个插入语句;
- 触发第二个插入语句;
- 犯罪;
- 交易结束
现在,当用户在第 4 步提交时,
- 所有插入语句都在时间 T1 写入文件系统中的事务日志
- 确认发送给用户事务已提交,尽管它将在时间 T2 在步骤 3 中完成
- 现在交易在时间 T3 异步进行
以上理解正确吗?如果是,我的问题是为什么在第 3 步之后不发送确认信息?另外,如果 DB 机器在 T2 之前崩溃,那么事务将不持久怎么办?因此,使用日志,我们只是确保数据库是否在 T2 和 T3 时间崩溃,然后我们可以确保持久性
第二个理解 我相信所有事务语句都可以在语句被触发后立即写入日志,而不是在提交时执行。一旦提交完成,事务日志将被标记为提交并发送确认。现在即使数据库在确认后崩溃,数据库也会确保从事务日志中写入数据库文件。因此,基本上,Db 不是在提交时一次性编写所有事务语句,而是在它们触发时在日志中写入语句。在提交时,它只是将这些事务标记为提交,最终将写入日志中的数据库块
从 oracle 的角度来看这个问题