故事

我有一个使用快照隔离的 SPROC 通过 MERGE 执行多个插入。此 SPROC 以非常高的负载调用并且通常是并行调用的,因此它偶尔会抛出错误 3960 - 这表明快照因更改冲突而回滚。由于高并发性,这是意料之中的。

问题

我已经实现了一个“重试”队列,以便稍后再次执行这项工作,但我很难重现错误以验证我的检查是否准确。

问题

如何重现快照故障(特别是 3960)以验证我的重试逻辑是否正常工作?

已经尝试过

  • RAISEERROR 不起作用,因为它不允许我提出现有错误,只有用户定义的
  • 我试过重新插入相同的记录,但这不会引发相同的失败,因为它不是两个不同的事务“竞争”另一个
  • 最佳答案

    打开两个连接,在两个连接上启动快照事务,在连接 1 上更新一条记录,在连接 2 上更新同一条记录(在后台,因为它会阻塞),然后在连接 1 上提交

    或者将用户错误视为 3960 ...

    关于sql - 如何强制快照隔离失败 3960,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10018210/

    10-13 08:49