您的位置:首页 > 编程语言 > Java开发

Spring事务超时、回滚的相关说明

2016-07-06 17:47 537 查看
事务超时:
@Transactional(timeout = 60)

如果用这个注解描述一个方法的话,线程已经跑到方法里面,如果已经过去60秒了还没跑完这个方法并且线程在这个方法中的后面还有涉及到对数据库的增删改查操作时会报事务超时错误(会回滚)。如果已经过去60秒了还没跑完但是后面已经没有涉及到对数据库的增删改查操作,那么这时不会报事务超时错误(不会回滚)。

回滚:
Spring管理事务默认回滚的异常是什么?

答案是 RuntimeException或者Error,即unchecked Exception
详见http://blog.csdn.net/u012557814/article/details/50685374

注意:如果事务在try{}catch(Exception e){e.printStackTrace();}中跑,并且catch中只是打印e的话,那么事务不会rollback。因为异常被catch掉了,框架不知道发生了异常。
如果想要rollback,可以加上rollbackFor=Exception.class,然后:
①在方法上添加 throws  Exception,将方法中出现的异常抛出给spring事务,
②去掉方法体中的try catch
③catch (Exception e) {  throw e;}继续向上抛,目的是让spring事务捕获这个异常。
④不加rollbackFor=Exception.class,catch(){
 
  throw new RunTimeException();
}
如果不加rollbackFor=Exception.class,抛出new Exception()
是不会回滚的。Spring源码如下:

public boolean rollbackOn(Throwable ex) { 
  
  return (ex instanceof RuntimeException || ex instanceof Error);

如果是RuntimeException或Error的话,就返回True,表示要回滚,否则返回False,表示不回滚。

只有spring事务捕获到Exception异常后,@Transactional(rollbackFor=Exception.class),才会起到应有的作用;catch (Exception e) {            e.printStackTrace();        }这句是捕获try中出现的Exception然后将异常信息打印出来,仅仅是打印出来,然后什么也没干。

@Transactional(timeout =
60,rollbackFor=Exception.class)与@Transactional(timeout = 60)区别:
rollbackFor=Exception.class的作用是让checked例外也回滚,即让编译错误也回滚。
需要注明的是:
1 让checked例外也回滚:在整个方法前加上 @Transactional(rollbackFor=Exception.class)

2 让unchecked例外不回滚: @Transactional(notRollbackFor=RunTimeException.class)

checked exception是编译时的错误,Unchecked exception是运行时错误,详见http://meng702.iteye.com/blog/998379
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Spring事务 回滚