请高手指教呀,sql server 2000存储过程中关于事务的问题

quielybb 2006-03-16 04:09:32
请教高手们一个存储过程中关于事务处理的问题,存储过程如下:
create proc p_insert
(
@username varchar(50),
@address varchar(60),
@intro varchar(400),
@return_name varchar(50) output
)
as
set nocount on
declare @err int,@errcount int
set @errcount=0
LockTimeOutRetry:
if exists (select * from ad_vip where username=@username)
begin
begin tran
insert usertable
select @username,@address,@intro
set @err=@@error
if @err<>0
rollback tran
goto ErrorHandler
end
else
begin
set @return_name='用户名不存在'
return -100
end
commit tran
ErrorHandler:
if (@err=1222 or @err=1205) and @errcount=5
begin
raiserror('错误',16,1)
return -100
end
if @err=1222 or @err=1205
begin
waitfor delay '00:00:00.25'
set @errcount=@errcount+1
goto LockTimeOutRetry
end
go

现在的问题就是为什么我的commit tran写在现在的位置上就会报错,
错误提示是:EXECUTE 后的事务计数指出缺少了 COMMIT 或 ROLLBACK TRANSACTION 语句。原计数 = 0,当前计数 = 1。

如果我要是把commit tran写到存储过程的最后面的go前面就没事呢?难道commit必须是存储过程语句中的最后一句吗?可以我看有些高手写的存储过程,commit提交想写在哪里都行呀?不明白呀,请高手指教
...全文
101 点赞 收藏 4
写回复
4 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
quielybb 2006-03-16
那根据我现在的代码,我的begin tran和commit tran都应该放在什么位置上呢?请教指
回复
OracleRoob 2006-03-16
begin tran

commit tran

适于放在外层,另外在begin tran 前加SET XACT_ABORT ON 确保事务处理的整体提交或整体回滚

SET XACT_ABORT
指定当 Transact-SQL 语句产生运行时错误时,Microsoft® SQL Server™ 是否自动回滚当前事务。

详细信息,查看帮助联机
回复
OracleRoob 2006-03-16

create proc p_insert
(
@username varchar(50),
@address varchar(60),
@intro varchar(400),
@return_name varchar(50) output
)
as

set nocount on

set xact_abort on

declare @err int,@errcount int
set @errcount=0

LockTimeOutRetry:

if exists (select * from ad_vip where username=@username)
begin
begin tran
insert usertable
select @username,@address,@intro

set @err=@@error
if @err<>0
begin
rollback tran
goto ErrorHandler
end
else
begin
commit tran
return 0
end
end
else
begin
set @return_name='用户名不存在'
return -100
end


ErrorHandler:
if (@err=1222 or @err=1205) and @errcount=5
begin
raiserror('错误',16,1)
return -100
end

if @err=1222 or @err=1205
begin
waitfor delay '00:00:00.25'
set @errcount=@errcount+1
goto LockTimeOutRetry
end

GO


--调用

declare @ret int,@output varchar(1000)

exec @ret=p_insert 'tom','Beijing','test',@output output

select @ret,@output
回复
wgsasd311 2006-03-16
很简单,你看看代码一目了然,放在现在位置,缺了begin tran和他配对,而放在最后是因为你的
goto语句转到上面了,没有执行到rollback tran所以才不报错.
回复
相关推荐
发帖
疑难问题
创建于2007-09-28

2.1w+

社区成员

MS-SQL Server 疑难问题
申请成为版主
帖子事件
创建了帖子
2006-03-16 04:09
社区公告
暂无公告