SQL Server - 使用UPDLOCK提示查询期间发生死锁

时间:2017-05-22 08:31:41

标签: c# sql-server deadlock

我有一个C#代码,它使用EntityFramework来执行一堆SQL语句:

using (var context = new MyDbContext())
{
    context.Database.ExecuteSqlCommand(preparedQuery.QueryText);
}

该查询用于更新具有持续清理数据的表,并且为了避免竞争条件问题,它使用Serializable事务隔离级别和UPDLOCK表提示。 preparedQuery.QueryText是一个字符串,如下所示:

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
BEGIN TRAN T11;
DECLARE @Flag int;
SET @Flag = (SELECT Count(*)  FROM MyTable  WITH (UPDLOCK) WHERE Field1 = '1' AND Field2 = '2')
IF (@Flag > 0) 
BEGIN
    UPDATE MyTable SET Filed3 = '3'  WHERE Field1 = '1' AND Field2 = '2'
END

C#方法不时抛出SqlException,并带有以下消息:

  

事务(进程ID 202)在锁定资源上死锁   另一个进程并被选为死锁受害者。重新运行   事务。

一开始就有UPDLOCK表提示的SQL可序列化事务如何被解锁?事务的第一个查询获得数据的Update锁定。使用此查询可以使哪种其他事务陷入僵局?

0 个答案:

没有答案