解决死锁的SqlException通信缓存资源

我们Microsoft Sql 服务器上的数据库执行 CRUD 操作。为此,连接管理器(注册为范围服务)IDbConnection在请求范围内打开一个新连接;此连接用于执行删除、插入、更新或获取。对于插入/更新/删除,C# 行如下所示await connection.ExecuteAsync("", entity);对于GET请求,我们只需运行await connection.QueryFirstOrDefaultAsync("", entity);;有 5 种类型的实体(都呈现简单的非关系表)。他们都按 ID CRUD。

到目前为止已经尝试过什么

MAXDOP=1 对 SQL 语句的查询提示
确保一种实体在给定时间点只有 1 个实体 CRUD。
重新启动 SQL 服务器/应用程序实例
确保端口/RAM/CPU/网络带宽没有耗尽
更改 DATABASE XXXXXX SET READ_COMMITTED_SNAPSHOT ON/OFF
保持交易尽可能小
持久重试策略作为一种解决方法(处理问题的随机瞬态性质)
每个实体类型一个线程

死锁通常是需要查询和索引调整的症状。下面是来自死锁跟踪的示例查询,它表明了死锁的根本原因:

`

``java
<inputbuf>
@SomeStatus1 nvarchar(4000),@ProductName nvarchar(4000),@ProductNameSide nvarchar(4000),@BayNo nvarchar(4000),@CreatedDateTime datetime,@EffectiveDate datetime,@ForSaleFrom datetime,@ForSaleTo datetime,@SetupInfoNode nvarchar(4000),@LocationNumber nvarchar(4000),@AverageProductPrice decimal(3,2),@NetAverageCost decimal(3,1),@FocustProductType nvarchar(4000),@IsProduceCode nvarchar(4000),@ActivationIndicator nvarchar(4000),@ResourceType nvarchar(4000),@ProductIdentifierNumber nvarchar(4000),@SellingStatus nvarchar(4000),@SectionId nvarchar(4000),@SectionName nvarchar(4000),@SellPriceGroup nvarchar(4000),@ShelfCapacity decimal(1,0),@SellingPriceTaxExclu decimal(2,0),@SellingPriceTaxInclu decimal(2,0),@UnitToSell nvarchar(4000),@VendorNumber nvarchar(4000),@PastDate datetime,@PastPrice decimal(29,0))
UPDATE dbo.ProductPricingTable 
SET SellingPriceTaxExclu = @SellingPriceTaxExclu, SellingPriceTaxInclu = @SellingPriceTaxInclu, 
SellPriceGroup = @SellPriceGroup, 
ActivationIndicator = @ActivationIndicator, 
IsProduceCode = @IsProduceCode, 
EffectiveDate = @EffectiveDate, 
NetCos

找到与您的 sql 异常时间/数据相对应的死锁事件。然后结合检测和结束死锁指南阅读此报告,以了解死锁问题的根本原因。就我而言,我在通信缓冲区上遇到了死锁,因此按照本指南,内存(Memory检测和结束死锁指南的部分)一定是导致问题的原因。正如 Dan 指出的那样,在我的情况下,死锁报告中出现了以下查询,该报告使用了太多缓冲区(由于查询效率低下)。那么什么是通信缓冲区死锁?好吧,如果这个查询需要太多的缓冲区来完成它的执行,那么两个这样的查询可以同时开始执行并开始申请他们需要的缓冲区,但在某些时候可用的缓冲区可能不够,他们将不得不等待完成其他查询的执行释放了更多缓冲区。因此,两个查询都等待对方完成,以期释放更多缓冲区。这可能导致缓冲区死锁(根据指南的内存部分)


```xml
<inputbuf>
@SomeStatus1 nvarchar(4000),@ProductName nvarchar(4000),@ProductNameSide nvarchar(4000),@BayNo nvarchar(4000),@CreatedDateTime datetime,@EffectiveDate datetime,@ForSaleFrom datetime,@ForSaleTo datetime,@SetupInfoNode nvarchar(4000),@LocationNumber nvarchar(4000),@AverageProductPrice decimal(3,2),@NetAverageCost decimal(3,1),@FocustProductType nvarchar(4000),@IsProduceCode nvarchar(4000),@ActivationIndicator nvarchar(4000),@ResourceType nvarchar(4000),@ProductIdentifierNumber nvarchar(4000),@SellingStatus nvarchar(4000),@SectionId nvarchar(4000),@SectionName nvarchar(4000),@SellPriceGroup nvarchar(4000),@ShelfCapacity decimal(1,0),@SellingPriceTaxExclu decimal(2,0),@SellingPriceTaxInclu decimal(2,0),@UnitToSell nvarchar(4000),@VendorNumber nvarchar(4000),@PastDate datetime,@PastPrice decimal(29,0))
UPDATE dbo.ProductPricingTable 
SET SellingPriceTaxExclu = @SellingPriceTaxExclu, SellingPriceTaxInclu = @SellingPriceTaxInclu, 
SellPriceGroup = @SellPriceGroup, 
ActivationIndicator = @ActivationIndicator, 
IsProduceCode = @IsProduceCode, 
EffectiveDate = @EffectiveDate, 
NetCos
</inputbuf>

解决问题

1、使用 jps -l 定位进程号

在这里插入图片描述2 使用 jstack 进程号 找到死锁问题

![在这里插入图片描述](https://img-blog.csdnimg.cn/1ce2131ae73a4dc8aff926b231be8f0c.png?x-oss-process=image在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值