请高手指教呀,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提交想写在哪里都行呀?不明白呀,请高手指教
...全文
161 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
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所以才不报错.

22,300

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧