序列化隔离级别的替代方案

时间:2016-01-07 07:44:26

标签: sql-server deadlock database-deadlocks

我有两个商店程序。在一个选择存储过程下面是读取数据并将状态更新为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,则应阻止行以供其他线程选择,并且不应该使用死锁。如果我错了,请纠正我。

如果有人帮我识别替代方案,我将不胜感激?

0 个答案:

没有答案
相关问题