我有一个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锁定。使用此查询可以使哪种其他事务陷入僵局?