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

这个存储过程从语法上会造成死锁?
CREATE PROCEDURE [dbo].aspnet_Vstock_Order_UserReset
@UserId uniqueidentifier,
@fMoney decimal(38,5),
@ErrorStr varchar(100) out
AS
BEGIN

declare @iError int

select @ErrorStr = ''
select @iError = 0

set xact_abort on
begin tran

delete from dbo.aspnet_Vstock_BuyOrder where UserId = @UserId
select @iError = @iError + @@Error
delete from dbo.aspnet_Vstock_Deal where UserId = @UserId
select @iError = @iError + @@Error
delete from dbo.aspnet_Vstock_DealHistory where UserId = @UserId
select @iError = @iError + @@Error
delete from dbo.aspnet_Vstock_SellOrder where UserId = @UserId
select @iError = @iError + @@Error
Update dbo.aspnet_Users set Vstock_TotalMoney = @fMoney where UserId = @UserId 
select @iError = @iError + @@Error

if @iError = 0
begin
commit
print '--------001@\r\n'
end
else
begin
rollback
print '--------001*\r\n'
end

  RETURN 0
END
GO


------解决方案--------------------
set xact_abort on 这个已经提示回滚了。 

这几张表对应@userid的数据是否很多啊? 另外,LZ数据库的隔离级别是?

数据多的话,有可能等待别人释放资源。当然得看隔离级别是否为已提交读。