事务(进程 ID82)与另一个进程被死锁在 锁 资源上,并且已被选作死锁牺牲品。请重新运行该事务。 返回

SqlSugar 沟通中
3 210

 public async Task<APIResult> GetScanList()

 {

     List<object> data = new List<object>();

     var list = await db.Queryable<h_tk_sacnlist>()

         .Where(v => v.created_by == App.HttpUser.UID && v.isru == false)

         .LeftJoin<h_tk_purchaseorderentry>((v, entry) => v.pentryid == entry.id.ToString())

         .OrderByDescending(v => v.created_time)

         .Select((v, entry) => new

         {

             v.id,

             v.syminfo,

             v.pentryid,

             v.cymaterial,

             v.reqty,

             v.cymaterialid,

             v.cymaterialname,

             v.unit,

             v.iskfperiod,

             v.isru,

             v.period,

             v.periodunit,

             v.specs,

             v.qty,

             v.sxqty,

             v.parentid,

             v.sqty,

             v.producedate,

             inventoryqty = SqlFunc.IIF(entry.id != null, entry.inventoryqty, 0)

         })

         .ToListAsync();


     list.ForEach(m =>

     {

         data.Add(new

         {

             scanid = m.id.ToString(),

             id = m.pentryid,

             cymaterial = m.cymaterial,

             reqty = m.reqty,

             cymaterialid = m.cymaterialid,

             cymaterialname = m.cymaterialname,

             unit = m.unit,

             iskfperiod = m.iskfperiod,

             isru = m.isru,

             period = m.period,

             periodunit = m.periodunit,

             specs = m.specs,

             qty = m.qty,

             sxqty = m.sxqty,

             parentid = m.parentid,

             sqty = m.sqty,

             producedate = m.producedate.ParseToTime(),

             username = App.HttpUser.Name,

             inventoryqty = m.inventoryqty,

             syminfo = m.syminfo

         });

     });


     return new APIResult()

     {

         Data = new

         {

             data

         }

     };

 }

这段代码总是报这个错误


热忱回答3

  •  MoreSettings = new ConnMoreSettings

     {

         IsAutoRemoveDataCache = true,

         SqlServerCodeFirstNvarchar = true, //sqlserver默认使用nvarchar

         IsWithNoLockQuery = true,//是否自动添加 WITH(NOLOCK)(允许脏读) 主查询

         IsWithNoLockSubquery = true, //子查询

         DisableWithNoLockWithTran = true//新功能:事务禁用NoLock 

     },
     "ConnectionString": "Server=.;Database=DJYOLD;User Id=sa;Password=123456;Connect Timeout=500;Encrypt=True;TrustServerCertificate=True;MultipleActiveResultSets=True;Max Pool Size=512;"这是我的配置



    0 回复
  • SQL SERVER 数据库这个问题,我也遇到过,不用开脏读,我教你一招,


    -- 在数据库级别启用行版本控制(需要单用户模式或无活动连接)
    ALTER DATABASE YourDatabaseName SET READ_COMMITTED_SNAPSHOT ON;

    相关文档:
    事务锁定和行版本控制指南
    https://learn.microsoft.com/zh-cn/sql/relational-databases/sql-server-transaction-locking-and-row-versioning-guide?view=sql-server-ver16


    你开了脏读还死锁,说明是真的有死锁,

    可以看微软的死锁指南排查下

    https://learn.microsoft.com/zh-cn/sql/relational-databases/sql-server-deadlocks-guide?view=sql-server-ver16


    以及写个扩展事件,抓一下死锁发生时到底是哪几个事务的SQL 死锁了,

    不会写,可以问Ai


    我经过上述的一系列操作,成功解决了这个问题。

    0 回复
  • fate sta fate sta VIP0
    1个月前

    1、查询要启nolock

    2、启用NOLOCK还有这个错一般是并发超过数据库处理能力

    0 回复