pujitan978 2022-03-27 10:10 采纳率: 28.6%
浏览 95
已结题

c# sqlserver 死锁

表tableA
id xId status
xid唯一

表tableB
id xid z e k
xid和z唯一

functionA(SqlConection Sqlcon, xid, z ){
SqlCommand myComm = Sqlcon .CreateCommand();
SqlTransaction myTran;
myTran= Sqlcon.BeginTransaction();
myComm.Conection=Sqlcon;
myComm.Transaction=myTran;

  try
  {
      //检索表B某行记录,加锁tableB
     SELECT id,xid ,e  FROM tableB  with(udplock) WHERE xid = ? and z = ?
      
     //检索表A某行记录,不加锁
     SELECT id,xid ,status   FROM tableA   WHERE xid = ? 

      //更新表A检索记录
     update  status  where xid = ?      

     //更新表B检索出记录
     update  k   FROM tableB where xid = ?   and z = ?

     //追加一条记录到表B
    insert  ........  FROM tableB
     myTran.commit();
}catch(){
    myTran.roolback()
 }

}

thread A{
sqlcon = new SqlConection();
sqlco.open()
xid 分配 1,2,3,4,5
for xid 循环调用
functionA(sqlcon , xid,1);
}

thread B{
sqlcon = new SqlConection();
sqlcon.open()
xid 分配 8,9,10,11
for xid 循环调用
functionA(sqlcon , xid,1);
}
}

线程A 和线程B 操作表A和表B不同的行。经常发生死锁
如果把 updlock 删除不发生死锁,但业务需要必须加锁。

1)帮分析下问题出在哪?

2)sqlserver如何通过日志查找那个sql和另一个sql死锁。

  • 写回答

4条回答 默认 最新

  • 歇歇 2022-03-27 12:39
    关注

    为什么会有两个查询?如果没有索引,查询会扫描所有行

    SELECT id,xid ,e  FROM tableB  with(udplock) WHERE xid = ? and z = ?
          
         //检索表A某行记录,不加锁
         SELECT id,xid ,status   FROM tableA   WHERE xid = ? 
    
    

    把查询去掉

    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 4月4日
  • 创建了问题 3月27日