2012-04-04 81 views
3

故事我怎么能强迫3960

的快照隔离故障我有使用快照隔离通过合并执行几个插入一个存储过程。此SPROC以非常高的负载调用,并且通常并行调用,因此偶尔会引发错误3960-这表明快照由于更改冲突而回滚。由于高并发性,这是预期的。

问题

我已经实现了一个“重试”的队列稍后再执行此工作,但我有困难再现错误来验证我的支票是准确的。

问题

我怎样才能重现快照失败(3960,特别是)来验证我的重试逻辑是工作?

已经尝试过

  • RAISEERROR不起作用,因为它不容许我提出存在的错误,只有用户定义的人
  • 我已经试过重新插入相同的记录,但这不会引发同样的错误,因为它不是两个不同的交易“赛车”另一
+1

如果您已经独立于实际的错误捕获测试了各个部分,那么您可以使用代码。如果你的新代码失败并错过了错误,那么现在它失败的时候就不会更糟。 – 2012-04-10 17:26:40

回答

0

为什么不只是这样做:

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

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

(不,马丁指出,这是行不通的。)


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

+1

'RAISERROR'不能用于引发系统错误编号。 – 2012-04-10 19:18:14

+1

呵呵,对吧。猜猜我以前从未尝试过...无论如何,其他方法应该工作(如果测试查询不是太快)。 *我以前做过*。 – RBarryYoung 2012-04-10 19:21:54

+0

感谢您的回复!我没有花时间尝试重新创造竞争条件,没有任何运气。最终,团队决定代码支持足够的日志记录,因此它被批准实时部署。 – Jordan 2012-04-11 20:01:14

1

打开两个连接,开始在两个快照事务,在连接1次更新的记录,在连接2更新相同的记录(在背景,因为它会阻止),然后在连接1提交

或治疗用户错误为3960 ...