UPDLOCK提示查询期间发生死锁
我有一个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序列化事务死锁? 事务的第一个查询获取数据的更新锁。 此查询可能会导致哪些其他事务处于死锁状态?