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
@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
相关文章推荐
- MySql事务无法回滚的原因有哪些
- 实现MySQL回滚的Python脚本的编写教程
- mysql实现事务的提交和回滚实例
- Spring事务的传播行为
- PHP事物处理机制
- Liferay事务管理(Transaction Management)
- 当一个数据库插入事务由于错误被回滚时,被插入表中标识字段的值该发生怎么样的变化?
- Spring事务管理
- MySQL事务部分回滚-回滚到指定保存点
- MYSQL中的事务处理
- iOS 点击状态栏回滚scrollView顶部
- Spring声明式事务注意事项
- SSH Spring3事务配置
- 详解spring事务属性 <转
- 【SQL学习笔记】查询结果resultset无法回滚问题
- spring事务的传播特性
- spring 事务管理
- spring实现声明式事务原理
- h数据库事务隔离级别
- Spring事务详解