我有一个proc,它具有并行调用的更新查询。我已经使用Sybase select for update命令来选择行集,以便获取这些记录集的事务应该负责更新,并且没有其他事务应该选择并更新相同的记录。 但在使用select for update后,我收到以下错误:
"Your server command (family id #0, process id #416) encountered a deadlock situation. Please re-run your command."
基本上我试图在并行线程中调用proc,并且其中一个线程能够执行更新查询并且休息所有线程失败并给出上述异常。 这是代码段
begin transaction
declare x cursor for select a from B where c=1 for update of p
open x
fetch x into @N
while(@@sqlstatus != 2)
begin
update B set p=1
where a =@N
end
commit transaction
答案 0 :(得分:0)
这可能是由于为表设置了表/所有页锁定级别,这意味着当事务开始时,该进程获取整个表的锁。
您的第一个进程和第二个进程正在尝试获取相同资源上的锁,并导致死锁。
要在服务器范围内更改锁定,您可以使用:
sp_configure "lock scheme", 0, [ allpages | datapages | datarows ]
基于每个表格进行更改
alter table <tablename>
lock [ allpages | datapages | datarows ]
有关详细信息,请查看Sybase文档的以下部分: