spring 的声明式事务注解@Transactional,只在抛出RuntimeException异常的时候,才会回滚。只抛出普通Exception的话,不会回滚。如:
@Transactional public void upgradeTalent(User user, Date updateAt) throws Exception { TalentLevel levelOne = talentLevelService.getTalentLevel(1); long levelId = levelOne.getTalentLevelId(); user.setTalentLevelId(levelId); user.setUpdateAt(updateAt); user.setUpdateBy(user.getUserId()); user.setUpdateType(1); //前台更新类型 int beans = levelOne.getBeans(); user.setBeans(user.getBeans() + beans); userService.updateField(user,"talentLevelId,updateAt,updateBy,updateType,beans"); Integer.parseInt("fsdf"); // throw new Exception("非运行期的普通异常"); Talent talent = new Talent(); talent.setCreateAt(updateAt); talent.setUserId(user.getUserId()); talent.setTalentLevelId(levelId); talent.setUpdateAt(updateAt); talent.setUpdateBy(talent.getTalentId()); talent.setUpdateType(1);//前台更新类型 talent.setLastUpgradeAt(updateAt); long talentId = creat(talent); }
这个upgradeTalent方法以 Integer.parseInt("fdfs")为界,分为两个事务,userService.updateField和creat(talent),整个upgradeTalent方法加了注解,是一个大事务,要么userService.updateField和creat(talent)同时成功,要么同时失败。
上面的Integer.parseInt("fdfs")方法会抛出NumberFormatException,这个异常是RuntimeException的一个子类,所以事务会回滚,没有更新到User表和Talent表。如果这时候把上面Integer.parseInt("fdfs")改为手动抛出一个非RuntimeException,如改成:throw new Exception("普通异常"),当方法执行到抛出异常这行代码时,即使整个方法加了@Transactional的注解,事务也不会回滚,user表已经被更新,造成脏数据。
所以,在使用spring @Transactional注解的时候,要注意一下。
另外,用Integer.parseInt("fdfs")这句代码,是为了验证发生异常后事务回滚的问题,实际情况可能是其它原因造成异常。
RuntimeException继承Exception
其实Transactional在定义的时候,也说明了事务的使用范围:RetentionPolicy.RUNTIME
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Transactional
相关推荐
花了一晚上时间终于搞出来了Spring整合Mybatis事务回滚(Mysql数据库),控制Service层中的多次插入操作,多次操作整体是一个事务。 里面有缘嘛和jar包,资源为war包,导入即可。运行Test类中的测试代码即可。 建表...
自己做的一个简单的spring运用实例,主要是关于事务回滚的一个小例子,希望对还在纠结事务回滚的童靴有点帮助。。。
Spring中@Transactional事务回滚(含实例详细讲解,附源码)Java开发Java经验技巧共8页.pdf.zip
Spring/SpringMVC/MyBatis整合,可事务回滚
本篇文章主要介绍了浅谈Spring中@Transactional事务回滚及示例(附源码),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
Spring的事务管理默认只对出现运行期异常(java.lang.RuntimeException及其子类)进行回滚,需要了解更多Spring事务方面的知识,可详看本
主要介绍了Spring异常捕获且回滚事务解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
集成了Spring 3.2.2 Hibernate 3.3.2 Struts 2.3.4 用JPA的注解实现orm 不用创建数据库表 只需本机上有oracle即可 用JSR注解进行Spring的...用Spring Test整合Junit4 进行测试并自动事务回滚 不对数据库造成持久化操作
Spring中的JdbcTemplate,Spring中的的事务.。。。。。。。
1. 基于Aspectj实现动态数据源...6. 实现事务内切换数据源(支持原生Spring声明式事务哟,仅此一家),并支持多数据源事务回滚(有了它除了跨服务的事务你需要考虑分布式事务,其他都不需要,极大的减少了系统的复杂程度)
主要介绍了spring事务异常回滚实例解析,具有一定借鉴价值,需要的朋友可以参考下
主要给大家介绍了关于mongoDB 4.0事务回滚的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用MongoDB具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
主要介绍了使用SpringBoot注解方式处理事务回滚实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
下面小编就为大家带来一篇完美解决Spring声明式事务不回滚的问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
spring boot 纯注解方法事务控制回滚,注解+简单配置文件使用多线程demo
Spring事务管理A方法内部调用B方法的回滚问题测试代码
采用spring boot +mybatis+shiro+swagger+ehcache+quartz+freemarker+layui技术开发;实现功能有系统模块:菜单管理、用户管理、角色管理,系统监控:系统日志、接口api、sql监控。本项目会一直维护并集成新的技术,...
主要介绍了java Spring事务回滚的相关资料,需要的朋友可以参考下
Spring Cloud Gateway中的全局异常处理不能直接用@ControllerAdvice来处理,通过跟踪异常信息的抛出,找到对应的源码,自定义一些处理逻辑来符合业务的需求。 网关都是给接口做代理转发的,后端对应的都是REST API,...
我们在捕获到异常并对异常进行处理时可能会遇到如下一些问题: ...5.接口抛出异常,破坏封装,打破了接口与实现之间的清晰界限。 6.异常处理代码散落在,修改起来时非常麻烦。无法对某些异常进行统一处理和修改。