日期:2014-05-18  浏览次数:20531 次

存储过程中事务的问题
我有以下存储过程:
create   procedure   proc_aa

@a   varchar(10).
@b   varchar(10)
@ret   int
as  

begin   tran

declare   @id   int
select   @id=id   from   a
select   @id   =   @id   +   1
insert   into   b(a,id)   values(@a,@id)
if   @error <> 0
begin
    rollback   tran
    set   @ret=-1
    return
end

update   a   set   id=@id
if   @error <> 0
begin
    rollback   tran
    set   @ret=-1
    return
end

commit   tran
set   @ret=1
return

客户端调用此存储过程的频率很高的,现在两张表a和b总是死锁




------解决方案--------------------
在存储过程里加上下面的设置:
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
设置事务隔离级别,在commit之前,其他事务只能读。
------解决方案--------------------
create procedure proc_aa
@a varchar(10).
@b varchar(10)
@ret int
as
set lock_timeout 20000
set transaction isolation level read uncommitted
begin tran strat
declare @id int
select @id=id from a
select @id = @id + 1
insert into b(a,id) values(@a,@id)

if @error <> 0
begin
set @ret=-1
rollback tran strat
return
end
else
begin
update a set id=@id
if @error <> 0
begin
set @ret=-1
rollback tran strat
return
end
set @ret=1
commit tran strat
end
return
------解决方案--------------------
LZ 可以加上 with(nolock) 试试看

select @id=id from a with(nolock)