Sybase ASE:“您的服务器命令遇到死锁情况”

Posted

技术标签:

【中文标题】Sybase ASE:“您的服务器命令遇到死锁情况”【英文标题】:Sybase ASE: "Your server command encountered a deadlock situation" 【发布时间】:2009-07-10 00:48:56 【问题描述】:

在运行执行 INSERT 和 UPDATE 的存储过程(来自 .NET 应用程序)时,我有时(但不是那么频繁,真的)随机收到此错误:

ERROR [40001] [DataDirect][ODBC Sybase Wire Protocol driver][SQL Server]您的服务器命令(系列 ID #0,进程 ID #46)遇到死锁情况。请重新运行您的命令。

我该如何解决这个问题?

谢谢。

【问题讨论】:

您知道什么是死锁,为什么会发生死锁...以及为什么 您的 代码会发生这种情况?你试过用谷歌搜索“sybase”和“死锁”吗? 是的,我知道它是什么,是的,我已经用谷歌搜索过了。问题是,死锁很少发生。由于查询很简单(更新和插入),如果其他锁阻塞它,它最坏的情况应该被服务器延迟,而不仅仅是将其丢弃。此外,错误并没有说明死锁是什么(什么表、行等),这使得解决问题变得困难。我无法手动阻止 2 个查询同时到达服务器! 死锁永远不会延迟其他进程,它会阻止其他进程死亡 - 我会阅读更多关于死锁的内容,因为您还没有表现出理解 这就是重点,马克。我是说它/应该/被延迟,例如,这是预期的行为。当然,这里的问题不是我得到的行为,因为它不是被延迟,而是导致死锁并被完全阻塞。 【参考方案1】:

解决死锁问题的最佳选择是将“打印死锁信息”设置为 on using

sp_configure "打印死锁信息", 1

每次出现死锁时,这将打印有关哪些进程涉及哪些进程以及死锁时它们正在运行什么 sql 的信息。

如果您的表正在使用所有页面锁定。切换到数据行或数据页锁定可以减少死锁。如果您这样做,请确保收集有关表的新统计信息并重新创建访问已更改表的索引、视图、存储过程和触发器。如果不这样做,您将得到错误或看不到更改的全部好处,具体取决于哪些未重新创建。

【讨论】:

【参考方案2】:

我有一组长期使用的应用程序,它们偶尔会通过 lap table 访问,sybase 会抛出此错误。如果您检查 sybase 服务器日志,它将为您提供有关其发生原因的完整信息。喜欢:涉及两个进程试图获得锁的sql。通常一个人尝试阅读,另一个人做一些类似删除的事情。在我的情况下,应用程序在单独的 JVM 中运行,因此无法同步,只需定期清理即可。

【讨论】:

【参考方案3】:

假设您的表已正确索引(并且您实际上正在使用这些索引 - 总是值得通过查询计划进行检查),您可以尝试将 SP 的组件部分分解并将它们包装在单独的事务中,以便每个单元工作在下一个开始之前完成。

 begin transaction 
   update mytable1 
     set mycolumn = "test"
   where ID=1

 commit transaction
 go

 begin transaction 
  insert into mytable2 (mycolumn) select mycolumn from mytable1 where ID = 1
 commit transaction
 go

【讨论】:

其实今天我又遇到了同样的问题,存储过程只包含一条语句(INSERT)...

以上是关于Sybase ASE:“您的服务器命令遇到死锁情况”的主要内容,如果未能解决你的问题,请参考以下文章

SYBASE ASE上排查问题自定义存储过程

如何将 Sybase ASE smalldatetime/datetime/bigdatetime 转换为标准格式

Python 3.4 - Sybase ASE 连接

选择sybase ase中id值最高的记录

带有 Sybase ASE 15.5 的 LINQToEntities

Sybase ASE 15.7 中的审计表触发器