6

在运行执行 INSERT 和 UPDATE 的存储过程(来自 .NET 应用程序)时,我有时(但实际上并不经常)随机收到此错误:

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

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

谢谢。

4

3 回答 3

8

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

sp_configure "打印死锁信息", 1

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

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

于 2009-07-25T08:50:24.473 回答
2

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

于 2009-11-23T17:47:25.490 回答
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
于 2009-07-10T20:15:01.623 回答