Sybase for update SQL 导致死锁
Sybase for update SQL causing deadlock
我有一个 proc,它具有并行调用的更新查询。我使用 Sybase select 将更新命令更新到 select 行集,以便拾取这些记录集的事务应负责更新,而其他事务不应 select 并更新相同的记录。
但是在使用 select 进行更新后,我收到以下错误:
"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
这可能是由于 Table/All 为 table 设置的页面锁定级别,这意味着当事务开始时,进程获取整个 table 的锁。
您的第一个进程和第二个进程正在尝试获取对相同资源的锁定,这导致了死锁。
要在服务器范围内更改锁定,您可以使用:
sp_configure "lock scheme", 0, [ allpages | datapages | datarows ]
根据 table 进行更改
alter table <tablename>
lock [ allpages | datapages | datarows ]
查看 Sybase 文档的以下部分以获取更多信息:
我有一个 proc,它具有并行调用的更新查询。我使用 Sybase select 将更新命令更新到 select 行集,以便拾取这些记录集的事务应负责更新,而其他事务不应 select 并更新相同的记录。 但是在使用 select 进行更新后,我收到以下错误:
"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
这可能是由于 Table/All 为 table 设置的页面锁定级别,这意味着当事务开始时,进程获取整个 table 的锁。
您的第一个进程和第二个进程正在尝试获取对相同资源的锁定,这导致了死锁。
要在服务器范围内更改锁定,您可以使用:
sp_configure "lock scheme", 0, [ allpages | datapages | datarows ]
根据 table 进行更改
alter table <tablename>
lock [ allpages | datapages | datarows ]
查看 Sybase 文档的以下部分以获取更多信息: