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)