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

Lau*_*ent 6 sql stored-procedures sybase-ase database-deadlocks

当运行执行INSERT和UPDATE的存储过程(来自.NET应用程序)时,我有时(但不经常,真的)并随机获取此错误:

错误[40001] [DataDirect] [ODBC Sybase Wire协议驱动程序] [SQL Server]您的服务器命令(系列ID#0,进程ID#46)遇到死锁情况.请重新运行您的命令.

我怎样才能解决这个问题?

谢谢.

小智 7

解决死锁问题的最佳方法是将"打印死锁信息"设置为使用

sp_configure"print deadlock information",1

每次出现死锁时,都会打印出有关涉及哪些进程以及死锁时它们运行的​​sql的信息.

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


小智 0

假设您的表已正确建立索引(并且您实际上正在使用这些索引 - 始终值得通过查询计划进行检查),您可以尝试分解 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
Run Code Online (Sandbox Code Playgroud)