为何两个C# .NET Framework应用未在SQL Server数据库中产生死锁?
无法复现SQL Server死锁的问题描述
我有两个基于*.NET Framework v4.8*的C#应用,均操作本地PC上的同一SQL Server数据库。两个应用都会持续运行以下代码:
try { // 持续高频执行查询,试图和另一个进程触发死锁 while (true) { using (SqlConnection sqlConnection = new SqlConnection(connectionString)) { sqlConnection.Open(); RunNonQuery(sql1, sqlConnection); RunSelect(sql2, sqlConnection); RunNonQuery(sql3, sqlConnection); Console.WriteLine("No exception encountered yet..."); } } } catch (Exception ex) { Console.WriteLine("Exception encountered:"); Console.WriteLine(ex.Message); Console.ReadLine(); Environment.Exit(1); }
两个应用的唯一区别在于使用的SQL语句不同:
程序1的SQL语句
string sql1 = @"BEGIN TRAN; UPDATE SomeTable SET Message = 'Some Message' WHERE Id = 1 WAITFOR DELAY '00:00:10.000'"; string sql2 = @"SELECT * FROM SomeOtherTable"; string sql3 = @"ROLLBACK TRAN;";
程序2的SQL语句
string sql1 = @"BEGIN TRAN; UPDATE SomeOtherTable SET Message = 'Some Message' WHERE Id = 1 WAITFOR DELAY '00:00:10.000'"; string sql2 = @"SELECT * FROM SomeTable"; string sql3 = @"ROLLBACK TRAN;";
预期的死锁场景
我会在10秒内先后启动两个应用,预期程序1先持有SomeTable的锁,程序2持有SomeOtherTable的锁。程序1启动10秒后会等待程序2释放SomeOtherTable的锁,程序2启动10秒后会等待程序1释放SomeTable的锁,此时应该触发死锁。
疑问
我对数据库锁及并发数据库.NET应用交互经验不足,怀疑无法复现死锁的原因与当前查询持有的锁类型,或是SQL Server数据库、数据库连接中被我无意修改的设置有关。
内容的提问来源于stack exchange,提问作者Jaybee72
相关产品推荐
相关产品推荐

