Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何强制3960的快照隔离失败_Sql_Sql Server_Sql Server 2008_Tsql_Snapshot - Fatal编程技术网

Sql 如何强制3960的快照隔离失败

Sql 如何强制3960的快照隔离失败,sql,sql-server,sql-server-2008,tsql,snapshot,Sql,Sql Server,Sql Server 2008,Tsql,Snapshot,故事 我有一个存储过程,使用快照隔离通过合并执行多个插入。此存储过程是以非常高的负载调用的,通常是并行调用的,因此它偶尔会抛出一个错误3960,这表示快照由于更改冲突而回滚。这是预期的,因为高并发性 问题 我已经实现了一个“重试”队列,以便稍后再次执行此工作,但我很难再现错误以验证我的检查是否准确 问题 我如何再现快照故障(特别是3960),以验证重试逻辑是否正常工作 已尝试过 RAISEERROR不起作用,因为它不允许我提出现有错误,只允许提出用户定义的错误 我尝试重新插入相同的记录,但这不

故事

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

问题

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

问题

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

已尝试过

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

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

      (不,正如马丁指出的那样,这是行不通的。)



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

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


      或者将用户错误视为3960…

      如果您已经独立于实际错误捕获测试了各个部分,则只需使用代码即可。如果你的新代码失败并错过了错误,它不会比现在失败时更糟糕。嗯,你说得对。我想我以前从没试过。。。无论如何,另一种方法应该可以工作(如果测试查询不是太快)。这是我以前做过的。谢谢你的回复!我确实花了时间试图在没有任何运气的情况下重新创造比赛条件。最终,团队决定该代码得到足够的日志支持,因此批准部署live。