表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死锁。