已经有很多关于此问题的不同版本的stackoverflow问题,但是没有一个能帮助我解决我的问题。因此,我再次提供更具体的问题细节。
我们一直在随机获得“Transaction (Process ID xx) was deadlocked on lock | communication buffer resources with another process and has been chosen as the deadlock victim. Rerun the transaction.”。请注意,这不是行或表级锁定。我已经尝试了足够的猜测/随机尝试;我需要确切的逐步指南,以解决通信缓冲区上的死锁。
如果您对具体细节感兴趣,请继续阅读。
具体情况的细节:我们有一个非常简单的基于Dapper ORM的C# .net core Web API,它接受请求并对托管在此Microsoft Sql服务器上的数据库执行CRUD操作。为此,连接管理器(注册为作用域服务)在请求范围内打开一个新的IDbConnection连接;此连接用于执行删除、插入、更新或获取操作。对于插入/更新/删除C#代码如下:await connection.ExecuteAsync("<Create update or delete statement>", entity); 对于GET请求,我们只需运行await connection.QueryFirstOrDefaultAsync<TEntity>("<select statement>", entity); ;共有5种实体(均呈现简单的非关系型表格)。它们都通过ID进行CRUD。
到目前为止尝试过的方法:
1. SQL语句上的MAXDOP=1查询提示 2. 确保在给定时间点只有一个实体进行CRUD操作。 3. 重新启动SQL服务器/应用程序实例 4. 确保端口/RAM/CPU/网络带宽没有耗尽 5. Alter DATABASE XXXXXX SET READ_COMMITTED_SNAPSHOT ON/OFF 6. 让事务尽可能小 7. 持久性重试策略作为解决随机瞬态问题的解决方法 8. 每种实体类型使用单个线程
服务器规格:我们在虚拟机中托管了Microsoft Sql Server 2016 On Azure,具有64个核心和400GB RAM。此服务器的通常工作负载为10% CPU和30% RAM,偶尔会达到80% CPU和350GB RAM。在发生此问题的所有时刻,CPU使用率都低于20%(大多数情况下约为10%,只有一次为20%),RAM在所有情况下都低于30%。
根据@Dan Guzman的要求,死锁XML事件如下:文件大小对于此帖子来说太大了,因此创建了此Google Drive文件。请单击以下链接,然后在右上角单击下载。这是一个zip文件。
我们一直在随机获得“Transaction (Process ID xx) was deadlocked on lock | communication buffer resources with another process and has been chosen as the deadlock victim. Rerun the transaction.”。请注意,这不是行或表级锁定。我已经尝试了足够的猜测/随机尝试;我需要确切的逐步指南,以解决通信缓冲区上的死锁。
如果您对具体细节感兴趣,请继续阅读。
具体情况的细节:我们有一个非常简单的基于Dapper ORM的C# .net core Web API,它接受请求并对托管在此Microsoft Sql服务器上的数据库执行CRUD操作。为此,连接管理器(注册为作用域服务)在请求范围内打开一个新的IDbConnection连接;此连接用于执行删除、插入、更新或获取操作。对于插入/更新/删除C#代码如下:await connection.ExecuteAsync("<Create update or delete statement>", entity); 对于GET请求,我们只需运行await connection.QueryFirstOrDefaultAsync<TEntity>("<select statement>", entity); ;共有5种实体(均呈现简单的非关系型表格)。它们都通过ID进行CRUD。
到目前为止尝试过的方法:
1. SQL语句上的MAXDOP=1查询提示 2. 确保在给定时间点只有一个实体进行CRUD操作。 3. 重新启动SQL服务器/应用程序实例 4. 确保端口/RAM/CPU/网络带宽没有耗尽 5. Alter DATABASE XXXXXX SET READ_COMMITTED_SNAPSHOT ON/OFF 6. 让事务尽可能小 7. 持久性重试策略作为解决随机瞬态问题的解决方法 8. 每种实体类型使用单个线程
服务器规格:我们在虚拟机中托管了Microsoft Sql Server 2016 On Azure,具有64个核心和400GB RAM。此服务器的通常工作负载为10% CPU和30% RAM,偶尔会达到80% CPU和350GB RAM。在发生此问题的所有时刻,CPU使用率都低于20%(大多数情况下约为10%,只有一次为20%),RAM在所有情况下都低于30%。
根据@Dan Guzman的要求,死锁XML事件如下:文件大小对于此帖子来说太大了,因此创建了此Google Drive文件。请单击以下链接,然后在右上角单击下载。这是一个zip文件。
https://drive.google.com/file/d/1oZ4dT8Yrd2uW2oBqBy9XK_laq7ftGzFJ/view?usp=sharing
nvarchar(4000)
。当引用的列类型不同时,这可能会阻止索引的有效使用,导致在UPDATE
查询期间进行全表扫描,从而引发死锁。尝试使用与引用列相同类型的强类型参数,并检查执行计划以提高效率。 - Dan Guzman