slowjams Asked: 2019-07-03 16:02:52 +0800 CST2019-07-03 16:02:52 +0800 CST 2019-07-03 16:02:52 +0800 CST 系统故障导致两个事务不一致 772 假设用户 A 的交易 4 上面的图片。 A 更新了 Account 表中的一条记录,将余额从 100 更改为 0,然后出现了一个检查点,因此所有脏页都写入了磁盘。 在时间 t,用户 B 检查 Account 表并将余额为零的记录添加到 Audit 表中,并在系统故障前立即提交。然后出现系统故障,所以事务4被回滚了,对于账户id 1234,然后余额又是100,所以这个账户id不应该在Audit表中,而是因为用户B添加了它。那么如何解决这种不一致呢? sql-server locking 1 个回答 Voted Best Answer HandyD 2019-07-03T22:10:53+08:002019-07-03T22:10:53+08:00 这个问题是无效的 - 事务 4 在系统故障之前提交或者它没有提交,但是您已经声明它确实提交了,但是随后回滚并且您的图表表明事务在系统故障时仍未提交。 如果 Tran 4 在失败之前提交,那么它会被写入事务日志并在恢复期间前滚到数据库中。对审计表的后续查询将显示余额为 0。 如果 Tran 4 在失败之前没有提交,恢复将回滚事务,随后对审计表的查询将显示余额 100。 如果您的审计表必须在历史上和事务上保持一致,则需要在更新源表的同一事务中更新审计表,以维护在两个表之间在事务上保持一致的完美历史记录。 如果审计只需要最新值而不是中间值,那么您应该编写一个“正确”脚本,该脚本将使用源表中的最新值更新审计表,并将其作为恢复后步骤运行,甚至作为常规代理工作。
这个问题是无效的 - 事务 4 在系统故障之前提交或者它没有提交,但是您已经声明它确实提交了,但是随后回滚并且您的图表表明事务在系统故障时仍未提交。
如果 Tran 4 在失败之前提交,那么它会被写入事务日志并在恢复期间前滚到数据库中。对审计表的后续查询将显示余额为 0。
如果 Tran 4 在失败之前没有提交,恢复将回滚事务,随后对审计表的查询将显示余额 100。
如果您的审计表必须在历史上和事务上保持一致,则需要在更新源表的同一事务中更新审计表,以维护在两个表之间在事务上保持一致的完美历史记录。
如果审计只需要最新值而不是中间值,那么您应该编写一个“正确”脚本,该脚本将使用源表中的最新值更新审计表,并将其作为恢复后步骤运行,甚至作为常规代理工作。