sorry,明显我说错了,很久的帖了 简单说:不要在潜逃事务里用rollbak or return,会让事务overalter PROCEDURE Test3AS BEGIN --申明一个字符串,内容为回滚事务,并报错 declare @strSql nvarchar(1000) set @strSql=' raiserror(''有错误产生!'',16,1) if @@ERROR =0 begin commit transaction End ' --开始事务 begin tran exec (@strSql) if @@error <>0 commit tran else rollback end
alter PROCEDURE Test3 AS BEGIN --开始事务 declare @tran int set @tran=0 begin tran begin tran t1 raiserror('有错误产生!',16,1) set @tran=@@ERROR+@tran if @tran=0 commit tran t1 if @tran =0 commit tran else rollback end--嵌套这样写,内层不要rollback
这样写的目的是防止怀疑业务逻辑出了问题,因为上面的代码不涉及具体业务,只是简单的报错并回滚,为什么会出现错误呢?
简单说:不要在潜逃事务里用rollbak or return,会让事务overalter PROCEDURE Test3AS
BEGIN
--申明一个字符串,内容为回滚事务,并报错
declare @strSql nvarchar(1000)
set @strSql='
raiserror(''有错误产生!'',16,1)
if @@ERROR =0
begin
commit transaction
End
'
--开始事务
begin tran
exec (@strSql)
if @@error <>0
commit tran
else
rollback
end
AS
BEGIN
--开始事务
declare @tran int
set @tran=0
begin tran
begin tran t1
raiserror('有错误产生!',16,1)
set @tran=@@ERROR+@tran
if @tran=0
commit tran t1
if @tran =0
commit tran
else
rollback
end--嵌套这样写,内层不要rollback