4

故事

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

问题

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

问题

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

已经尝试过

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

2 回答 2

1

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

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

于 2012-07-14T09:21:29.357 回答
0

Why not just do this:

RAISERROR(3960, {sev}, {state})

Replacing {sev} and {state} with the actual values that you see when the error occurs in production?

(Nope, as Martin pointed out, that doesn't work.)


If not that then I would suggest trying to run your test query multiple times simultaneously. I have done this myself to simulate other concurrency errors. It should be doable as long as the test query is not too fast (a couple of seconds at least).

于 2012-04-10T17:01:26.293 回答