===== 帮忙看下一个事务与异常处理的问题 =======

愚者只看星不看答案 2016-11-14 05:15:29

declare @result int=0;
begin tran
begin try
insert into table1 values('','');
if @@ROWCOUNT<>1
begin
set @result=-1;
goto rollback_label;
end
update table2 set filed1='' where id=@id;
if @@ROWCOUNT<>1
begin
set @result=-2;
goto rollback_label;
end
end try
begin catch
set @result=-255;
end catch

rollback_label:
if @result<>0
rollback tran;
else
commit tran;

return @result;



请帮忙看下,上面的begin try和事务的写法有没有什么问题,多谢。
...全文
332 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
LongRui888 2016-11-15
  • 打赏
  • 举报
回复
引用 7 楼 truelove12 的回复:
[quote=引用 5 楼 yupeigu 的回复:] try 和catch是一对,当在try执行代码发生异常时,就在catch中处理,而try和catch本身并不需要在一个事务中,而是事务在一个try-catch中,受到监控,如果出问题,那就回滚,如果正常就提交。
感谢回复,我看到有些示例中,像你这样的写法时,总是会在begin catch 中这样写 if @@trancount<>0 rollback 我也很奇怪,明明是在begin catch中表示捕捉到异常,为何还要做这样的判断,多谢。[/quote] 这个主要是begin catch本身是捕获到异常,而不会进行回滚操作,这里的@@trancount是判断一下,当前会话中的未提交事务的个数,如果不为0,表示还有没提交的事务,那就回滚一下。
Tiger_Zhao 2016-11-15
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 truelove12 的回复:]我看到有些示例中,像你这样的写法时,总是会在begin catch 中这样写

if @@trancount<>0
rollback

我也很奇怪,明明是在begin catch中表示捕捉到异常,为何还要做这样的判断,多谢。 [/Quote]
因为错误可能是在 begin tran 之前触发的,没启动事务当然不需要 rollback 咯。
  • 打赏
  • 举报
回复
引用 3 楼 Tiger_Zhao 的回复:
[quote=引用 2 楼 wmxcn2000 的回复:] rollback_label: 这个上面,要增加一个 return 语句;
不需要加的,正常更新后需要 commit 啊![/quote] 感谢回复。
  • 打赏
  • 举报
回复
引用 1 楼 wmxcn2000 的回复:
语法是没有问题的,但这些语句中有 UPDATE 语句,不能放 function 中,只能放在存储过程中;
感谢回复。
  • 打赏
  • 举报
回复
引用 5 楼 yupeigu 的回复:
try 和catch是一对,当在try执行代码发生异常时,就在catch中处理,而try和catch本身并不需要在一个事务中,而是事务在一个try-catch中,受到监控,如果出问题,那就回滚,如果正常就提交。
感谢回复,我看到有些示例中,像你这样的写法时,总是会在begin catch 中这样写 if @@trancount<>0 rollback 我也很奇怪,明明是在begin catch中表示捕捉到异常,为何还要做这样的判断,多谢。
卖水果的net 版主 2016-11-14
  • 打赏
  • 举报
回复
引用 3 楼 Tiger_Zhao 的回复:
不需要加的,正常更新后需要 commit 啊!
大师,你好长时间不露面了。
LongRui888 2016-11-14
  • 打赏
  • 举报
回复
try 和catch是一对,当在try执行代码发生异常时,就在catch中处理,而try和catch本身并不需要在一个事务中,而是事务在一个try-catch中,受到监控,如果出问题,那就回滚,如果正常就提交。
LongRui888 2016-11-14
  • 打赏
  • 举报
回复
尽量别用goto语句。 建议把begin try 放到begin tran的外层: begin try begin tran commit tran end try begin catch rollback tran end catch
Tiger_Zhao 2016-11-14
  • 打赏
  • 举报
回复
引用 2 楼 wmxcn2000 的回复:
rollback_label: 这个上面,要增加一个 return 语句;
不需要加的,正常更新后需要 commit 啊!
卖水果的net 版主 2016-11-14
  • 打赏
  • 举报
回复
rollback_label: 这个上面,要增加一个 return 语句;
卖水果的net 版主 2016-11-14
  • 打赏
  • 举报
回复
语法是没有问题的,但这些语句中有 UPDATE 语句,不能放 function 中,只能放在存储过程中;

34,838

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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