我有两个商店程序。在一个选择存储过程下面是读取数据并将状态更新为1然后选择数据。
cython
获取数据后,我们进行一些处理,然后使用下面存储的proc将状态更新为2。
ALTER PROCEDURE [dbo].[SP_GetPolicyEventsOminibusbyEvents]
(
@PublishStatus int,
@TopN int
)
AS
--SET TRANSACTION ISOLATION LEVEL Serializable
BEGIN TRANSACTION POLICYEVENTS
Declare @eventId int
Create table #tempEvents
(
[EventID] [int] NOT NULL,
)
Insert into #tempEvents
(
[EventID]
)
(Select top(@TopN) [EventID] FROM [dbo].[PolicyEventsOminibus] WITH (UPDLOCK,READPAST) WHERE [PublishStatus] = @PublishStatus)
update [PolicyEventsOminibus] set [PublishStatus]=1 where Eventid in (Select #tempEvents.eventid from #tempEvents)
Select [PolicyEventsOminibus].* FROM [dbo].[PolicyEventsOminibus] WITH (UPDLOCK,READPAST) where Eventid IN(Select #tempEvents.eventid from #tempEvents)
drop TABLE #tempEvents
commit TRANSACTION POLICYEVENTS
但是在没有使用隔离级别序列化的情况下,我得到了死锁,因为"事务(进程ID 61)在锁资源上与另一个进程死锁,并被选为死锁牺牲品。"运行多个会话或实例时
我想避免选择存储过程中的序列化,特别是因为它会阻止插入。 我在堆栈上看到了其他相关问题。但没有帮助。
我的理解是,如果我们应用READPAST和UPDLOCK,则应阻止行以供其他线程选择,并且不应该使用死锁。如果我错了,请纠正我。
如果有人帮我识别替代方案,我将不胜感激?