1.死锁的原因在于两个事务对资源加锁的冲突,比如:
事务甲:锁住资源A->想锁资源B(此时资源B被事务乙锁住,必须等待释放)
在事务甲锁住资源A的同一瞬间:
事务乙:锁住资源B->想锁资源A(此时资源A被事务甲锁住,必须等待释放)
两个事务都在等待对方释放资源,好比两个人同时从独木桥的两端过桥,又互不相让;
2.除了按w102272所说优化以外,你可以检查并调整经常发生死锁的两个事务对表进行加锁的顺序;单纯的查询语句不要放在事务中处理。
3.本人曾仔细研究过事务嵌套及在任一层的提交或回滚对数据的影响,规律虽然记不起了,但却知道处理事务的方法,即:事务的提交或回滚均应在最外层,具体方法为:
create procedure StoredProcedure1
as
begin
declare @trncount int
select @trncount=@@trancount
begin transaction
.....
if @@error<>0
begin
if @trncount=0 rollback transactin
return -1
end
if @trncount=0 commit transaction
return 0
end
存储过程的调用也一样:
create procedure StoredProcedure2
as
begin
declare @trncount int,@ret int
select @trncount=@@trancount
begin transaction
.....
exec @ret=StoredProcedure1
if @ret<>0
begin
if @trncount=0 rollback transactin
return @ret
end