接续两次执行delete+insert Into为什么会死锁?
连续两次执行delete+insert Into为什么会死锁??
如果我把不打开注释,执行不会发生死锁,反之,就会。为什么呢
前面已经开启事务,而select也加了with(updlock)
求求大家帮帮忙了
------解决方案--------------------
updlock 已经造成了执行语句的串行化了吧?
------解决方案--------------------
不建议用.NET 事务,你既然开了事务,执行一次后,是不是等于没有 commit ,再执行第二次,是不是就是在等待第一次执行的commint。然而,你的程序里执行第一次时,代码有没有.NET事务的提交。
而且.NET的事务是啥级别的我没研究过,但是,我知道,如果一个人在调试程序,断点停在.Net 事务里,抱歉,所有人对数据库的访问都等着去吧...
------解决方案--------------------
至于三楼说的“不建议用.NET 事务,你既然开了事务,执行一次后,是不是等于没有 commit ,再执行第二次,是不是就是在等待第一次执行的commint。然而,你的程序里执行第一次时,代码有没有.NET事务的提交。”
.NET事物,跟数据库sql级别事物,没啥本质区别吧,类似操作,换做在数据库中执行,不也是一样的么?
------解决方案--------------------
internal bool AddPendingRloc(Entity.Fun.PendRlocRQ pendRloc, out Message message)
{
message = new Message();
tbMOE_PendRloc db = IDABkgFolder.GetPendRloc(pendRloc.SourceSystem, pendRloc.SourceRef, pendRloc.OwnerTeam);
tbMOE_PendRloc pr = new tbMOE_PendRloc()
{
UpdateBy = pendRloc.OwnerStaff,
OwnerStaff = pendRloc.OwnerStaff,
CreateBy = pendRloc.OwnerStaff,
CreateOn = Now,
DepartDate = pendRloc.DepartDate,
NoOfTkt = pendRloc.NoOfYkt,
Passengers = pendRloc.Passengers,
SourceRef = pendRloc.SourceRef,
SourceSystem = pendRloc.SourceSystem,
UpdateOn = Now,
OwnerTeam = pendRloc.OwnerTeam,
};
if (pr.Passengers.Length > 500)
{
pr.Passengers = pr.Passengers.Substring(0, 500);
}
// IDABkgFolder.UpdatePendRloc(pr);
return IDABkgFolder.UpdatePendRloc(pr);
}
public bool Update(tbMOE_PendRloc updateEntity)
{
Delete(updateEntity.SourceRef, updateEntity.OwnerTeam);
return Add(updateEntity);
}
public bool Delete(string pnr, string team)
{
FilterParams fp = new FilterParams();
fp.AddParam(tbMOE_PendRloc.Fields.SourceRef, pnr, Enums.Relation.Equal, Enums.Expression.AND);
fp.AddParam(tbMOE_PendRloc.Fields.OwnerTeam, team, Enums.Relation.Equal, Enums.Expression.AND);
return base.Delete(fp);
}
public new bool Add(tbMOE_PendRloc entity)
{
return base.Add(entity);
}
如果我把不打开注释,执行不会发生死锁,反之,就会。为什么呢
前面已经开启事务,而select也加了with(updlock)
求求大家帮帮忙了
------解决方案--------------------
updlock 已经造成了执行语句的串行化了吧?
------解决方案--------------------
不建议用.NET 事务,你既然开了事务,执行一次后,是不是等于没有 commit ,再执行第二次,是不是就是在等待第一次执行的commint。然而,你的程序里执行第一次时,代码有没有.NET事务的提交。
而且.NET的事务是啥级别的我没研究过,但是,我知道,如果一个人在调试程序,断点停在.Net 事务里,抱歉,所有人对数据库的访问都等着去吧...
------解决方案--------------------
至于三楼说的“不建议用.NET 事务,你既然开了事务,执行一次后,是不是等于没有 commit ,再执行第二次,是不是就是在等待第一次执行的commint。然而,你的程序里执行第一次时,代码有没有.NET事务的提交。”
.NET事物,跟数据库sql级别事物,没啥本质区别吧,类似操作,换做在数据库中执行,不也是一样的么?
create table t
(
id int,
name varchar(20)
)
insert into t values (1,'AAA')
--执行如下代码,注意不提交
begin tran
delete from t where id =1
insert into t values (1,'BBB')
--新开一个查询窗口执行同样的代码
begin tran
delete from t where id =1
insert into t values (1,'BBB')
--第二个窗口的执行肯定被阻塞,这跟什么形式的事物没什么关系的
------解决方案--------------------