下面的文本来自Silberschatz的“数据库系统概念”一书。为什么与外部写入相关的值需要存储在数据库中的特殊关系中?我们就不能像其他价值观一样对待这些价值观吗?
在处理可观察到的外部写入时,我们必须谨慎,例如向用户屏幕写入或发送电子邮件。一旦发生这种写入,就不能删除它,因为它可能是在数据库系统外部看到的。大多数系统只允许在事务进入提交状态后才进行此类写入。实现此方案的一种方法是,数据库系统将与此类外部写入相关的任何值暂时存储在数据库中的一个特殊关系中,并仅在事务进入提交状态后才执行实际写入。如果系统在事务进入提交状态后失败,但在它完成外部写入之前,数据库系统将在系统重新启动时执行外部写入(使用非易失性存储中的数据)。
发布于 2021-01-06 22:01:22
我们就不能像其他价值观一样对待这些价值观吗?
这正是引用中所建议的:您将数据存储在外部(特殊)关系中,因为它们是特殊的、瞬态的实体。
假设您有一个工作流系统,其中通过更新用户的task属性(“内部写”)将user_id分配给用户。它还需要向该用户发送电子邮件通知(外部写入)。这两种情况都是异步发生的,但是外部事件必须总是在持久化内部事件之后发生。您可以像往常一样更新task记录(没有关于它的“假”),并创建一个新的outbound_email实体,包含任何相关的信息。当提交task更新时,您将处理outbound_email并删除瞬态记录。
这很像外部操作的预写日志:首先为操作创建一个记录,然后在适当的时候执行该操作,然后在不再需要的情况下丢弃日志记录。如果流被中断,则重放“日志”以恢复。
https://dba.stackexchange.com/questions/282698
复制相似问题