一个UnexpectedRollbackException异常解决
来源:互联网 发布:起点数据为 编辑:程序博客网 时间:2024/06/05 05:13
背景
2014-10-08号早上06:50之后,系统一直在报UnexpectedRollbackException异常。
stackTrace:
org.springframework.transaction.UnexpectedRollbackException: Transaction rolled back because it has been marked as rollback-only at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:718) at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:475) at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:270) at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:94) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:91) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204) at com.sun.proxy.$Proxy76.executeStatisticUserHandleRank(Unknown Source)
原因分析
碰到的问题大概可以简化成下面这样,伪代码大致如下:
ClassA.method(){
begin transaction;
beforeDone();
try
{
classB.doSomething(); //这里面有非受检异常抛出,所以标记为回滚, doSetRollbackOnly(status);
}catch(RuntimeException e)
{
}
afterDone();
commit;
end;
}
ClassB.doSomething()伪代码:
ClassB.doSomething(){
begin transaction;
/** do anything */ //这里会抛出一个runtime 的非受检异常
commit;
end;
}
这个是一个事务嵌套事务的例子,在spring里面我们配置了事务的传播机制是REQUIRED,所以这两个事务最终会合并成一个事务。程序中doSomething()中由于某某原因导致抛出异常(或者明确将该事务设置为了RollbackOnly),因为事务嵌套,ClassA.method()中有非受检异常抛出,标记并直接回滚,ClassB.doSomething()中有受检异常抛出,只是标记回滚状态,在调用回ClassA.method()中回滚,这个方法中ClassB.doSomething()有受检异常抛出,事务被标记为回滚,继续执行到ClassA.method(), 可是被捕获了,也就不回滚了,一直执行到最后commit。在commit时spring会判断回滚标志,若有回滚标记,回滚并抛出UnexpectedRollbackException异常,ransaction rolled back because it has been marked as rollback-only。
- 一个UnexpectedRollbackException异常解决
- 本人遇到的spring事务之UnexpectedRollbackException异常解决笔记
- 本人遇到的spring事务之UnexpectedRollbackException异常解决笔记
- spring:org.springframework.transaction.UnexpectedRollbackException解决
- 一个罕见C#异常的解决过程
- 一个Kettle异常的解决方式
- 解决htmlunit里SSL一个异常
- 一个springmvc的@RequestParam异常解决
- Spring事务管理UnexpectedRollbackException
- Spring事务 UnexpectedRollbackException
- spring事务管理UnexpectedRollbackException
- Spring事务管理UnexpectedRollbackException
- spring事务管理UnexpectedRollbackException
- 一个关于用Struts实现文件上传异常的解决
- 出现一个异常希望大家能帮忙解决!
- 找人帮忙解决一个Java程序编译出现异常
- 求大神解救!!!一个不懂的异常,该怎么解决?
- zeromq学习笔记和解决一个相关的异常
- Activity全局切换动画
- 宋浒智:内心小九九坏了你自己的投资之道
- jquery中的遍历函数
- 操作系统基础-上-操作系统概论及存储器管理
- 好的网站
- 一个UnexpectedRollbackException异常解决
- 单页Web应用程序
- Win7下的C语言开发环境
- 矩阵分解(MATRIX FACTORIZATION)在推荐系统中的应用
- 深入HTTP协议
- DbUnit实践:Spring Test Dbunit,H2数据库
- 根据实例探讨源代码管理
- Python爬虫----爬虫入门(2)
- yii2-分页,Yii2实现带搜索的分页功能