异常信息:

org.springframework.transaction.UnexpectedRollbackException: Transaction silently rolled back because it has been marked as rollback-onlyat org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:755)at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:714)at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:533)at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:304)at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:98)at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:688)

问题还原:

@Repository
public interface ConsumeTaskLockRepository extends CrudRepository<ConsumeTaskLock, Long> {// 省略代码
}

service方法:

    @Override@Transactional(isolation = Isolation.READ_COMMITTED, propagation = Propagation.REQUIRES_NEW)public boolean getLock(String ip, String owner) {int insertCnt = 0;try {// 当插入记录主键存储重复时,consumeTaskLockRepository.insert方法调用失败,会由Hibernate事务事务管理器标记为回滚insertCnt = consumeTaskLockRepository.insert(ip, new Date(), owner);} catch (Exception e) {e.printStackTrace();LOGGER.warn("ip = {} owner = {} get lock failed!", ip, owner);// 此处我们吞没了异常以为了事务是可以提交的,但是由于insert主键冲突Hibernate事务事务管理器标记为回滚,因此在Spring真正进行事务提交检查时候会失败// 抛出异常:org.springframework.transaction.UnexpectedRollbackException: Transaction silently rolled back because it has been marked as rollback-only}return insertCnt > 0;}

解决办法:

    @Override@Transactional(isolation = Isolation.READ_COMMITTED, propagation = Propagation.REQUIRES_NEW)public boolean getLock(String ip, String owner) {int insertCnt = 0;try {insertCnt = consumeTaskLockRepository.insert(ip, new Date(), owner);} catch (Exception e) {e.printStackTrace();LOGGER.warn("ip = {} owner = {} get lock failed!", ip, owner);// 手动标记事务回滚,此处标记回滚;该方法执行完毕不会执行提交操作,直接回滚因此不会有如上异常TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();}return insertCnt > 0;}

这个问题一般性产生原因:

事务调用链路(事务传播性:org.springframework.transaction.TransactionDefinition#PROPAGATION_REQUIRED):A->B->C 时,在C中调用出现异常之后,该异常被Spring事务管理器捕获之后标记事务回滚;C执行返回A时,A对B->C的调用异常进行了try-catch之后吞没了异常而没有再次抛出,因此A方法结束之后Spring事务管理器认为事务是可以提交的,但是在C方法已经标记失败,因此冲突抛出异常。

注意:Spring事务管理时候一定要切记异常如何处理,是否再次抛出!!!大道理都懂,时长疏忽犯错。

Spring事务异常UnexpectedRollbackException出现原因以及解决方法相关推荐

  1. 飞车手游服务器维护,QQ飞车手游更新出现异常怎么办 更新异常原因及解决方法技巧...

    最近很多玩家都在体验QQ飞车手游吧,而且最近又一次更新,更新之后,大家发现出现各种异常BUG,那么QQ飞车手游更新出现异常怎么办?更新异常原因及解决方法!如果你也遇到这样的情况,不妨来看看小编是如何解 ...

  2. 阿里云磁盘异常爆满的原因及解决方法

    阿里云磁盘提示使用率为100%,提示网站打不开,原因则无一例外都是磁盘爆满,导致mysql停止工作,删除部分文件后,网站恢复访问,不过过不多久,网站又再次因为磁盘爆满而打不开,在服务器上找了一圈的原因 ...

  3. JS Uncaught SyntaxError:Unexpected identifier异常报错原因及其解决方法

    最近在写ajax的时候,调用js方法,遇到了Uncaught SyntaxError:Unexpected identifier异常报错,开始搞不清原因,很苦恼. 以为是js方法参数个数和长度的问题, ...

  4. 2012网站服务器目录磁盘满了,服务器磁盘异常爆满的原因及解决方法

    最近经常收到360网站监控发来的邮件,提示网站打不开,原因则无一例外都是磁盘爆满,导致mysql停止工作,删除部分文件后,网站恢复访问,不过过不多久,网站又再次因为磁盘爆满而打不开,在服务器上找了一圈 ...

  5. ClassCastException异常的出现原因和解决方法

    ClassCastException是JVM在检测到两个类型间转换不兼容时引发的运行时异常.此类错误通常会终止用户请求.在执行任何子系统的应用程序代码时都有可能发生ClassCastException ...

  6. 计算机开启时提示键盘错误,电脑开机出现异常提示keyboard not found的故障原因及解决方法_电脑故障...

    电脑开机后屏幕显示keyboard not found. press f2 to continue .f1 to setup,具体问题现象如下所示: 故障原因分析: 出现这样的情况大多都是电脑在开机的 ...

  7. Spring事务异常回滚,try catch 捕获异常不回滚

    Spring事务异常回滚,try catch 捕获异常不回滚 参考文章: (1)Spring事务异常回滚,try catch 捕获异常不回滚 (2)https://www.cnblogs.com/GH ...

  8. Spring事务异常回滚,捕获异常不抛出就不会回滚

    Spring事务异常回滚,捕获异常不抛出就不会回滚 参考文章: (1)Spring事务异常回滚,捕获异常不抛出就不会回滚 (2)https://www.cnblogs.com/chen-lhx/p/6 ...

  9. java.util.ConcurrentModificationException异常原因及解决方法

    java.util.ConcurrentModificationException异常原因及解决方法 参考文章: (1)java.util.ConcurrentModificationExceptio ...

最新文章

  1. 为ListView组件加上快速滑块以及修改快速滑块图像
  2. Java数据结构与算法——插入排序
  3. 利用RC网络降低可调节LDO输出噪声
  4. 16、修改数据表的存储引擎
  5. linux看系统硬件,Linux 查看系统硬件信息(实例详解)
  6. JS 封装事件(鼠标事件举例)-封装引入部分
  7. 正在将错误信息上传至服务器,android - 将Base64编码的图像上传到服务器-400服务器错误 - 堆栈内存溢出...
  8. Jsrender初体验
  9. 我为什么做程序猿訪谈录
  10. $.each(callback)方法
  11. 暗通道去雾及C++实现
  12. csdn的一篇文章的片段 职业初期的解惑
  13. 灭蚊灯UKCA FCC GB4706安全检测认证
  14. 《地球信息科学学报》发表宋关福博士论文:当GIS遇到人工智能
  15. 斗兽棋项目开发计划书
  16. ios云信不能全屏_网易云信-新增自定义消息(iOS版)
  17. Hinton最新演讲!一种新神经网络:前向-前向FF算法,论文已公开!
  18. nyoj 1239-引水工程 //并查集
  19. nodejs mysql knex_nodejs之knex模块从安装到使用
  20. 矩阵求逆(全选主元高斯-约当消去法)

热门文章

  1. Android 显示和控制gif动态图片的播放
  2. Unity更改默认编辑器
  3. #444 – DockPanel 中的子元素不一定一直都是平铺显示(Children of DockPanel Don’t Always Have to be Stretched)
  4. JfreeChart 生成图表-雷达图
  5. css 使用伪类在div底部画一条线
  6. Winform的高DPI问题
  7. SQL二进制转十进制
  8. Google Earth Engine——影像统计过程中出现的空值问题
  9. 高德地图Loca 数据可视化 API 2.0的用法
  10. 上证上市数据可视化分析展示