日期:2014-05-17  浏览次数:20498 次

try catch transaction rollback
您好,我是一名入门级别的学生,想咨询各位大神一下数据库中的问题,比如 我在一个事务中有操作游标,结构如下
begin try
   begin tran
      某某操作(有使用游标);
  commit tran
end try
begin catch
   if(@@trancount>0) rollback tran;
end  catch
我想咨询的是,
1、我上面的这样写法是不是比较普遍,没有什么问题吧?不会让别人感觉到我写的这个很奇怪把?
2、游标中的@@fetch_status值不为0的时候会不会抛出异常到catch中从而导致事务回滚?
    好像@@fetch_status值不为0的时候不会抛出异常到catch中,我之所以这样猜测是因为
一个游标建立之后,fetch next 读到最后一行之后肯定读不到了,导致@@fetch_status不为0,
但是这个情况是正常的,不应该抛出异常,那什么值的时候会抛出异常呢?
求各位高手给予小妹一点指导  谢谢

------解决方案--------------------
1、有这样的写法,但是不推荐。游标的使用建议还是多了解后,慎用! 性能影响比较大。
2、    SELECT  *   FROM    sys.messages   这个里面存在的均可触发异常处理。无需特别的控制,try里面会检测的。 @@fetch_status不为0 的情况,需要lz判断处理。这仅仅是一个结果性错误,而非语法或逻辑错误。
------解决方案--------------------
RAISERROR确实发生了作用,并执行了rollback,但是你并没有执行数据操作,而只是对变量进行操作,事务回滚是因为记录了事务日志,是对数据库结构及数据改动的记录,很显然事务日志没有必要去记录一个变量的创建于改动,你把变量换成update语句就可以看到效果了

还有,try catch也不是什么错误都能处理,具体你可以看看联机丛书
------解决方案--------------------
另外建议你能不用就尽量别用游标