关于sql事务回滚的一个小问题求教

jt_zhang 2017-07-20 01:54:56
在事务结束判断先提交再判断 错误回滚
commit tran tx
IF(@@error<>0)
rollback tran tx

和 先判断错误在提交
IF(@@error<>0)
rollback tran tx
else
commit tran tx

这两种有什么不同呢?求教........
...全文
146 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
OwenZeng_DBA 2017-07-20
  • 打赏
  • 举报
回复
引用 3 楼 jt_zhang 的回复:
[quote=引用 2 楼 sinat_28984567 的回复:] 仅供参考: 第一种写法先提交再判断是否有错误,这样的话中间执行的代码就可能生效了,因为是先提交的,然后这时候@error应该0 ,因为它标识的是最后一条语句的执行成功与否,所以不会再回滚 第二种比较常见,都是这么写,有问题了 就回滚,没问题了就提交。 http://www.cnblogs.com/seasons1987/p/3670107.html
可是 我测试的用第一种还是能回滚的: begin tran tx update user_info set user_pwd = '123' where user_pid = '123' update user_info set user_pwd = '123' where user_pid = '001' update b_test set ndate = '123' --错误的sql ndate :datetime格式 commit tran tx if @@ERROR <> 0 rollback tran tx 前两条 sql语句还是会回滚的....[/quote] 这个时候会回滚是因为这个报错这个语句: update b_test set ndate = '123' 自己就回滚了,,都没有运行到commit tran tx
二月十六 2017-07-20
  • 打赏
  • 举报
回复
引用 3 楼 jt_zhang 的回复:
[quote=引用 2 楼 sinat_28984567 的回复:] 仅供参考: 第一种写法先提交再判断是否有错误,这样的话中间执行的代码就可能生效了,因为是先提交的,然后这时候@error应该0 ,因为它标识的是最后一条语句的执行成功与否,所以不会再回滚 第二种比较常见,都是这么写,有问题了 就回滚,没问题了就提交。 http://www.cnblogs.com/seasons1987/p/3670107.html
可是 我测试的用第一种还是能回滚的: begin tran tx update user_info set user_pwd = '123' where user_pid = '123' update user_info set user_pwd = '123' where user_pid = '001' update b_test set ndate = '123' --错误的sql ndate :datetime格式 commit tran tx if @@ERROR <> 0 rollback tran tx 前两条 sql语句还是会回滚的....[/quote] 在begin tran 和commit tran 之间的dml操作,如果有错误,还是会回滚到begin tran之前的状态的
繁花尽流年 2017-07-20
  • 打赏
  • 举报
回复
引用 3 楼 jt_zhang 的回复:
[quote=引用 2 楼 sinat_28984567 的回复:] 仅供参考: 第一种写法先提交再判断是否有错误,这样的话中间执行的代码就可能生效了,因为是先提交的,然后这时候@error应该0 ,因为它标识的是最后一条语句的执行成功与否,所以不会再回滚 第二种比较常见,都是这么写,有问题了 就回滚,没问题了就提交。 http://www.cnblogs.com/seasons1987/p/3670107.html
可是 我测试的用第一种还是能回滚的: begin tran tx update user_info set user_pwd = '123' where user_pid = '123' update user_info set user_pwd = '123' where user_pid = '001' update b_test set ndate = '123' --错误的sql ndate :datetime格式 commit tran tx if @@ERROR <> 0 rollback tran tx 前两条 sql语句还是会回滚的....[/quote] 你这么写自然就是整个回滚了
jt_zhang 2017-07-20
  • 打赏
  • 举报
回复
引用 2 楼 sinat_28984567 的回复:
仅供参考: 第一种写法先提交再判断是否有错误,这样的话中间执行的代码就可能生效了,因为是先提交的,然后这时候@error应该0 ,因为它标识的是最后一条语句的执行成功与否,所以不会再回滚 第二种比较常见,都是这么写,有问题了 就回滚,没问题了就提交。 http://www.cnblogs.com/seasons1987/p/3670107.html
可是 我测试的用第一种还是能回滚的: begin tran tx update user_info set user_pwd = '123' where user_pid = '123' update user_info set user_pwd = '123' where user_pid = '001' update b_test set ndate = '123' --错误的sql ndate :datetime格式 commit tran tx if @@ERROR <> 0 rollback tran tx 前两条 sql语句还是会回滚的....
二月十六 2017-07-20
  • 打赏
  • 举报
回复
仅供参考: 第一种写法先提交再判断是否有错误,这样的话中间执行的代码就可能生效了,因为是先提交的,然后这时候@error应该0 ,因为它标识的是最后一条语句的执行成功与否,所以不会再回滚 第二种比较常见,都是这么写,有问题了 就回滚,没问题了就提交。 http://www.cnblogs.com/seasons1987/p/3670107.html
shoppo0505 2017-07-20
  • 打赏
  • 举报
回复
@@error返回的都是前一句语句的错误结果。 所以...

22,210

社区成员

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

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