You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何两个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 04:24:25