如何消除 SQL Server 2005 和 C# 应用程序中的死锁?

2023-12-28

我有一个用于 Windows 服务的 C# 代码,主要负责更新数据库表中的记录,但我的日志中总是出现很多错误,所有错误都与资源死锁有关,

这是错误:

System.Data.SqlClient.SqlException(0x80131904):事务(进程 ID 57) 与另一个进程在锁资源上发生死锁,并且已 被选为僵局受害者。重新运行事务。在 System.Data.SqlClient.SqlConnection.OnError(SqlException异常, 布尔中断连接、操作1 wrapCloseInAction) at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady) at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite) at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource1个完成,Int32超时,Task&任务, 布尔 asyncWrite) at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1 完成、字符串方法名称、布尔值 sendToPipe、Int32 超时、 布尔 asyncWrite) at System.Data.SqlClient.SqlCommand.ExecuteNonQuery() 在 WheelTrackListener.DataAccess.SQLDBA.ExecuteNQuery(SqlCommand cmd, Boolean isShowError、ConnectionStringType CountryCode、String 设备 ID、Int32 重试、字符串函数调用名称) 客户端连接 ID:e45e4cf1-a113-46b7-b9b5-dc5ee8111406

现在我想问一下,我可以尝试一下或者检查一下资源是否被锁定吗?如果锁定如何等待更新直到它被释放?

这是我当前的代码:

public static int updateVehicleLastPosition(string UTCDate, string UTC_Time, 
              string NS_Indicator, string Latitude, string EWIndicator, 
              string Longtitude, string Speed, string Processed, 
              string Near_ByLocation, string Near_ByLocation_AR, 
              string Gis_dataID, string address, string ar_adress, string Device_ID)
{
        SQLMethods sql = new SQLMethods();
        SqlCommand cmd = sql.cmdUpdateVehicleLastPosition(UTCDate, UTC_Time, NS_Indicator, Latitude, EWIndicator, Longtitude, Speed, Processed, Near_ByLocation, Near_ByLocation_AR, Gis_dataID, address, ar_adress, Device_ID);
        SQLDBA sqlDBA = new SQLDBA();
        return sqlDBA.ExecuteNQuery(cmd, true, ConnectionStringType.OMN, Device_ID, 10, "updateVehicleLastPosition");
}

public SqlCommand cmdUpdateVehicleLastPosition(string UTCDate, string UTC_Time, 
                      string NS_Indicator, string Latitude, string EWIndicator, 
                      string Longtitude, string Speed, string Processed, 
                      string Near_ByLocation, string Near_ByLocation_AR, 
                      string Gis_dataID, string address, string ar_adress, 
                      string Device_ID)
 {
        string sql = "UPDATE CTS_VehicleLastPosition SET [UTCDate] = @UTCDate, [UTC_Time] = @UTC_Time, [NS_Indicator] = @NS_Indicator, [Latitude] = @Latitude, [EWIndicator] = @EWIndicator, [Longtitude] = @Longtitude, [Speed] = @Speed, [Processed] = @Processed, [Near_ByLocation] = @Near_ByLocation, [Near_ByLocation_AR] = @Near_ByLocation_AR, [Gis_dataID] = @Gis_dataID, [address] = @address, [ar_adress] = @ar_adress WHERE [Device_ID] = @Device_ID";

        SqlCommand cmd = new SqlCommand(sql);
        cmd.Parameters.AddWithValue("@UTCDate", UTCDate);
        cmd.Parameters.AddWithValue("@UTC_Time", UTC_Time);
        cmd.Parameters.AddWithValue("@NS_Indicator", NS_Indicator);
        cmd.Parameters.AddWithValue("@Latitude", Latitude);
        cmd.Parameters.AddWithValue("@EWIndicator", EWIndicator);
        cmd.Parameters.AddWithValue("@Longtitude", Longtitude);
        cmd.Parameters.AddWithValue("@Speed", Speed);
        cmd.Parameters.AddWithValue("@Processed", Processed);
        cmd.Parameters.AddWithValue("@Near_ByLocation", Near_ByLocation);
        cmd.Parameters.AddWithValue("@Near_ByLocation_AR", Near_ByLocation_AR);
        cmd.Parameters.AddWithValue("@Gis_dataID", Gis_dataID);
        cmd.Parameters.AddWithValue("@address", address);
        cmd.Parameters.AddWithValue("@ar_adress", ar_adress);
        cmd.Parameters.AddWithValue("@Device_ID", Device_ID);
        return cmd;
}

public int ExecuteNQuery(SqlCommand cmd, bool isShowError, 
                    DataAccess.ConnectionStringType CountryCode, string deviceID, 
                    int retry, string functionCallName)
{
        ConnectionManager Connection = new ConnectionManager();
        try
        {
            Connection.GetConnection(CountryCode);
            if ((Connection.con == null) || (Connection.con.State != ConnectionState.Open))
            {
                if (retry <= 0) return 0;
                else return ExecuteNQuery(cmd, isShowError, CountryCode, deviceID, retry - 1, functionCallName);
            }
            int rowsAffected = 0;
            cmd.Connection = Connection.con;
            rowsAffected = cmd.ExecuteNonQuery();
            return rowsAffected;
        }
        catch (SqlException sqlexception)
        {
            if (isShowError)
                LEAMRALogger.Logger.WriteByDate("Logs\\SQLDBA\\" + functionCallName + "\\" + String.Format("{0:dd-MM-yyyy}", DateTime.Now), "SQLDBA", "SQLDBA_ERROR", "ExecuteNQuery Function: [deviceID: " + deviceID + " | retry: " + retry + "] " + sqlexception.ToString());
        }
        catch (Exception ex)
        {
            if (isShowError)
                LEAMRALogger.Logger.WriteByDate("Logs\\SQLDBA\\" + functionCallName + "\\" + String.Format("{0:dd-MM-yyyy}", DateTime.Now), "SQLDBA", "SQLDBA_ERROR", "ExecuteNQuery Function: [deviceID: " + deviceID + " | retry: " + retry + "] " + ex.ToString());
        }
        finally
        {
            if ((Connection.con != null) && (Connection.con.State == ConnectionState.Open))
            {
                Connection.con.Close();
                Connection.con.Dispose();
            }

            GC.Collect();
        }
        if (retry <= 0) return 0;
        else return ExecuteNQuery(cmd, isShowError, CountryCode, deviceID, retry - 1, functionCallName);
}

我在您的代码中看不到任何显式事务范围,因此我不知道当您进行更新时已经存在哪些锁;也不清楚您正在使用什么隔离级别。但这种情况下最常见的情况是,在同一事务的早期,您对稍后尝试更新的相同行发出了选择(读锁)。这将导致锁升级,如果两个事务尝试执行相同的操作,则可能导致死锁:

  1. 事务A:带读锁的select
  2. 事务B:选择并读取 锁
  3. 事务 A:更新 - 想要将其读锁升级为 写锁,但必须等待事务B释放其读 锁
  4. 事务 B:更新 - 想要将其读锁升级为 写锁,但必须等待事务A释放其读 锁。

答对了!死锁,因为 A 和 B 都在等待对方释放现有的读锁,然后才能进行更新。

为了防止这种情况,您需要在选择中添加 updlock 提示,例如,

select * from table with (updlock) where blah blah

这将确保您的选择使用写锁而不是读锁,从而防止并发事务之间的锁升级。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何消除 SQL Server 2005 和 C# 应用程序中的死锁? 的相关文章

  • EF Core 通过完全替换断开集合导航属性的更新

    使用 EF Core 5 0 我有一个 SPA 页面 可以加载Group实体及其集合Employee来自 API 的实体 var groupToUpdate await context Groups Include g gt g Emplo
  • 我如何在 C# .NET(win7 手机)中使用“DataContractJsonSerializer”读入“嵌套”Json 文件?

    我有一个问题 如果我的 json 文件看起来像这样 Numbers 45387 Words 空间桶 我可以很好地阅读它 但是如果它看起来像这样 Main Numbers 45387 Words 空间桶 某事 数字 12345 单词 克兰斯基
  • 找不到 assimp-vc140-mt.dll ASSIMP

    我已经从以下位置下载了 Assimp 项目http assimp sourceforge net main downloads html http assimp sourceforge net main downloads html Ass
  • ASP.Net Core 内容配置附件/内联

    我正在从 WebAPI 控制器返回一个文件 Content Disposition 标头值自动设置为 附件 例如 处置 附件 文件名 30956 pdf 文件名 UTF 8 30956 pdf 当它设置为附件时 浏览器将要求保存文件而不是打
  • 如何在 C# 控制台应用程序中将修饰符(ctrl、alt、shift)按键捕获为单个按键?

    Console ReadKey 仅在按下 正常 键时捕获输入 然后将修饰符 如果有 附加为键信息的一部分 如何将单个修饰键注册为输入 提供了一种解决方案这个链接 https blogs msdn microsoft com toub 200
  • 时间:2019-03-17 标签:c#ThreadSafeDeepCopy

    我一直在阅读很多其他问题以及大量谷歌搜索 但我一直无法找到明确的解决方案 根据我读过的一些最佳实践 类的静态方法应该创建线程安全的 并且实例成员应该将线程安全留给消费者 我想为该类实现深度复制方法 该类本身还有其他引用类型成员 有没有什么方
  • 动态生成的控件 ID 返回为 NULL

    我可以在 Page PreInit 函数中创建动态控件 如何检索控件及其 ID 我的 C 代码用于创建动态控件之一 var btn new WebForms Button btn Text btn ID Addmore btn Click
  • 如何获取 QTableView 的标题列表?

    我有一个QTableView我的对话框中的对象 我需要访问该表的水平标题并将它们放入QStringList object 尽管进行了大量搜索 但我在 Qt 文档中找不到如何获取此标头列表 编辑 我发现的最接近的地方是this https w
  • 单例模式和 std::unique_ptr

    std unique ptr唯一地控制它指向的对象 因此不使用引用计数 单例确保利用引用计数只能创建一个对象 那么会std unique ptr与单例执行相同 单例确保只有一个实例属于一种类型 A unique ptr确保只有一个智能指针到
  • Visual Studio Code:如何配置 includePath 以获得更好的 IntelliSense 结果

    我是使用 Visual Studio Code 的完全初学者 我不知道我在做什么 我已经四处搜索 也许还不够 但我找不到像我这样的人如何配置的简单解释c cpp properties json每当我单击带有绿色波浪线下划线的行旁边的黄色灯泡
  • std::forward_as_tuple 将参数传递给 2 个构造函数

    我想传递多个参数以便在函数内构造两个对象 以同样的方式std pair
  • C++ php 和静态库

    我创建了一个library a 其中包含 cpp 和 h 文件 其中包含很多类 嵌套类和方法 我想在 php 示例中包含这个静态库并尝试使用它 我想提一下 我是 php 新手 我已经在 test cpp 文件中测试了我的 libray a
  • 如何在事务中使用链接服务器插入远程表?

    我的链接服务器设置正确 我能够执行以下查询 插入 远程服务器 表 SELECT FROM 本地服务器 表 然而当我做同样的事情时交易内 开始传输 插入 远程服务器 表 SELECT FROM 本地服务器 表 提交交易 我收到类似的错误 用于
  • 如何在c的case语句中使用省略号?

    CASE expr no commas ELLIPSIS expr no commas 我在c的语法规则中看到了这样的规则 但是当我尝试重现它时 int test float i switch i case 1 3 printf hi 它失
  • ASP.NET MailMessage.BodyEncoding 和 MailMessage.SubjectEncoding 默认值

    很简单的问题 但我在 MSDN 上找不到答案 查找 ASP NET 将用于的默认值 MailMessage BodyEncoding and MailMessage SubjectEncoding 如果你不在代码中设置它们 Thanks F
  • 在 EnvDTE 中调试时捕获 VS 局部变量

    是否可以使用 EnvDTE 进行 vsix Visual Studio 扩展来捕获本地和调试窗口使用的调试数据 或者可以通过其他方法吗 我想创建一个自定义的本地窗口 我们可以修改它以根据需要显示一些较重的内容 而无需为高级用户牺牲原始的本地
  • 了解使用 Windows 本机 WPF 客户端进行 ADFS 登录

    我已经阅读了大量有关 ADFS 与 NodeJS Angular 或其他前端 Web 框架集成以及一般流程如何工作的文献 并通过 Auth0 Angular 起始代码构建了概念证明 但我不明白如何这可以与本机 WPF Windows 应用程
  • 使用taskkill停止Windows服务

    我需要帮助来使用 C 终止 Windows 服务 现在要终止该服务 请使用以下选项 从命令 sc queryex ServiceName 发现后PID服务的 taskkill pid 1234 exemple f 为了便于阅读 但如果您明白
  • SQL Server 中的嵌套事务

    sql server 允许嵌套事务吗 如果是的话那么交易的优先级是什么 来自 SQL Server 上的 MSDN 文档 嵌套交易 http msdn microsoft com en us library ms189336 SQL 90
  • QFileDialog::getSaveFileName 和默认的 selectedFilter

    我有 getSaveFileName 和一些过滤器 我希望当用户打开 保存 对话框时选择其中之一 Qt 文档说明如下 可以通过将 selectedFilter 设置为所需的值来选择默认过滤器 我尝试以下变体 QString selFilte

随机推荐

  • 通过点击单元格内的图像从 UITableViewCell 中转出

    我已经尝试解决这个问题有一段时间了 经过几个小时的寻找解决方案后 我决定是时候问了 我有一个由自定义 UITableViewCells 填充的表格视图 当前当您点击单元格时 它会将您带到详细视图 自定义单元格内有一个图像 我希望用户能够点击
  • ListView 显示字符串时出现问题

    任何人都可以帮助我在我的应用程序中以列表视图显示一组结果 我得到以下内容 codeList
  • 模拟挂起 lambda 在 Mockito 中返回 null

    依赖关系 testImplementation androidx arch core core testing 2 0 0 testImplementation org mockito mockito core 3 3 0 testImpl
  • 回合制多人骷髅演示应用程序

    我正在尝试让基于回合制多人游戏的演示应用程序正常工作 但遇到了问题 我已经编译并运行了代码 但每当我尝试实际连接或创建游戏时 都会收到此错误 DrawingActivity 13235 没有警告或字符串要处理 6003 该错误代码对应于此
  • 确定 CRAN 上 R 包历史版本的数量

    是否可以确定 CRAN 上的某个包过去拥有的版本数 这是一个使用XML包裹 这只是计算存档版本 更准确地说 是存档版本的数量 tar gz文件 加 1 即可得到版本总数 包括当前版本 nCRANArchived lt function pk
  • 使用相同的方法签名发布和获取

    在我的控制器中 我有两个名为 朋友 的操作 执行哪个取决于它是 get 还是 post 所以我的代码片段看起来像这样 Get AcceptVerbs HttpVerbs Get public ActionResult Friends do
  • PHP 是否有等效的forever.js 来连续运行我的脚本?

    我偶尔使用永远 js https github com nodejitsu forever用于将 CLI 类型的 Node js 应用程序快速而肮脏地部署到我不希望完全启动的生产环境中监督者 http supervisord org 部署
  • PyQt 无法识别箭头键

    我正在尝试编写一个 目前非常 简单的 PyQt 应用程序 并希望允许用户使用箭头键进行导航 而不是单击按钮 我已经实现了基础知识 并且在我的主要内容中QWidget 我覆盖keyPressEvent 现在 我所要求的就是它发出警报 QMes
  • “‘SELECT *’仅对单个输入集有效。”

    尝试学习沙箱中的查询语法 https www documentdb com sql demo https www documentdb com sql demo SELECT food id FROM food JOIN t in food
  • 使用 WPF C# 创建后台热键的正确方法? (最好不使用遗留代码)

    我需要能够为 WPF 应用程序设置后台热键事件 通过背景 我的意思是所讨论的应用程序可能不一定是焦点 我知道使用 WinForms 的正确方法是导入 user32 dll 并使用 RegisterHotKey 并捕获适当的 WM POST
  • 在一场战争中使用多个 CDI 配置文件(开发、测试版、质量保证、生产)?

    拥有使用 Spring DI applicationContext xml 声明依赖注入的方式的经验后 我现在尝试弄清楚如何使用 Java EE6 CDI 执行相同的操作 使用 Spring 我可以将我的 jar 与多个配置文件一起发送 例
  • 当 DEBUG 为 False 时错误处理程序不会触发

    我在用着错误处理程序 http flask pocoo org docs 0 10 patterns errorpages error handlers捕获并处理某些类型的异常 app errorhandler CustomExceptio
  • Android 两个具有相同值的整数不正确相等

    我不是java人 所以我不确定这是否只是一个语言问题 我正在编写一个 Android 应用程序 在应用程序中的某一时刻 我会与整数 版本号 进行比较 以查看它们正在使用的应用程序版本 如果它们不是最新的 则执行某些操作 我注意到我的操作代码
  • 隐藏 Invoke-WebRequest 的进度

    如何隐藏进度显示Invoke WebRequest 我连续提出了很多请求 并有自己的请求Write Progress我使用的显示器 所以我不需要每次都在它下面弹出内置的显示器 我使用从结果创建的 mshtml 结果 IE COM 对象 In
  • 将 CSS 应用于嵌入 img 标签的 SVG 图像

    在我的页面上 我使用 img 标签来嵌入 SVG 图像 现在我想在它们上应用一些CSS 只要将 SVG 源代码直接复制粘贴到页面中 这种方法就很有效 但是 如果我使用 img src 属性嵌入它们 则不会 有办法让它发挥作用吗 img sr
  • 如何在PowerShell中转义特殊字符?

    当我的 PowerShell 脚本运行时 它会提示用户输入密码参数 该密码可以包含任意数量的特殊字符 例如 然后将该密码用作 exe 命令的参数 但由于某些特殊字符未正确转义 该密码通常不正确 过去的密码示例是 我需要转义的唯一字符是 我将
  • Swift 包管理器 - Swift 4 语法

    我正在尝试使用更新后的 Swift4 SPM 如下所示Package swift file 包描述 API 版本 4 https github com apple swift package manager blob swift 4 0 b
  • AngularJS 中的 $$phase 是什么?

    我发现这个代码片段是某人为引导模式编写的角度指令的一部分 Update the visible value when the dialog is closed through UI actions Ok cancel etc
  • jQuery:选择具有唯一 ID 的所有输入(正则表达式/通配符选择器)

    我的网络表单上有一些文本框 它们的 id 如下 txtFinalDeadline 1 txtFinalDeadline 2 txtFinalDeadline 3 txtFinalDeadline 4 在我的 jQuery 中 我如何找到所有
  • 如何消除 SQL Server 2005 和 C# 应用程序中的死锁?

    我有一个用于 Windows 服务的 C 代码 主要负责更新数据库表中的记录 但我的日志中总是出现很多错误 所有错误都与资源死锁有关 这是错误 System Data SqlClient SqlException 0x80131904 事务