首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >server 2005死锁错误3930

server 2005死锁错误3930
EN

Database Administration用户
提问于 2013-04-10 09:32:34
回答 1查看 1.5K关注 0票数 1

我试图模拟在我们的生产服务器上发生的死锁问题的解决方案。

  1. 如果(选择OBJECT_ID(' dbo.MyProduct ') )不是空删除表dbo.MyProduct;去创建表dbo.MyProduct (ProductID INT,Price MONEY);插入dbo.MyProduct值(1,15.0),从MyProduct中选择*
  2. 创建一个proc。我将DEADLOCK_PRIORITY设置为低,以确保在出现死锁时事务将被回滚。创建过程dbo.服务提供商_xxx作为声明@Price INT SET DEADLOCK_PRIORITY LOW Price选择@Price = Price FROM dbo.MyProduct AS mp WITH(REPEATABLEREAD),其中mp.ProductID =1-允许事务2执行*/ WAITFOR延迟'00:00: 10‘如果@Price > 10更新dbo.MyProduct SET Price =Price-10其中ProductID =1提交
  3. 另一次会议。将死锁优先级设置为高,以确保在死锁情况下事务将继续进行。-事务2来自连接2集DEADLOCK_PRIORITY高位ApplyDiscount更新dbo.MyProduct SET Price =dbo.MyProduct* 0.6 -在价格> 10的情况下折扣40%
  4. 测试代码以在2中运行proc。它应该在死锁情况下重新运行proc。声明@retry TINYINT,@retry retrycount-3次,@retrycount TINYINT选择@retry=1,@retry=2,@retrycount =0,@retry =1和@retrycount <= @retry TRY SET @retry=0开始尝试打印'RetryCount:‘+ CAST(@retrycount AS VARCHAR(5)) exec SP_xxx END尝试开始捕捉打印'ERROR_NUMBER:’+ CAST(ERROR_NUMBER() AS VARCHAR(5))打印ERROR_MESSAGE()如果(ERROR_NUMBER() = 1205)开始SET @retry = @retrycount +1 SET @retry=1结束捕获结束
  5. 先跑4,然后10秒跑3。预期的结果是死锁将会发生,3将完成,4将在3完成后重试。但我明白了:为什么?

RetryCount: 0

ERROR_NUMBER: 1205

事务(进程ID 55)与另一个进程在锁定资源上陷入僵局,并被选择为死锁受害者。重新运行事务。

RetryCount: 1

ERROR_NUMBER: 3930

当前事务无法提交,也不能支持写入日志文件的操作。回退交易。

Msg 3998,第16级,状态1,第1行

在批处理结束时检测到不可提交事务。事务被回滚。

EN

回答 1

Database Administration用户

回答已采纳

发布于 2013-04-10 10:19:36

必须始终检查catch块中的XACT_STATE()。如果值为-1,则必须发出回滚。

票数 2
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/39623

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档