如何强制快照隔离失败3960

时间:2012-04-04 19:47:45

标签: sql sql-server sql-server-2008 tsql snapshot

故事

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

问题

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

问题

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

已经尝试

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

为什么不这样做:

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

用生产中发生错误时看到的实际值替换{sev}和{state}?

(不,正如马丁指出的那样,这不起作用。)


如果不是那样,那么我建议尝试多次同时运行您的测试查询。我自己这样做是为了模拟其他并发错误。只要测试查询不是太快(至少几秒钟),它应该是可行的。