由于业务需求要求,在一个Service的一个方法A中有一个for循环,每次循环里面的业务逻辑有可能发生异常,这个时候就需要将这个循环内的所有数据库操作给回滚掉,但是又不能影响到之前循环里数据的更改,并且后面的循环里不发生异常的情况下也需要正常操作数据库

for (int i = 0; i < educationInfoArrayList.size(); i++) {
String result = insertOrUpdateByOnce(educationInfoArrayList.get(i), beforeEntryArrayList.get(i), afterEntryArrayList.get(i), educationExperienceArrayList.get(i),
assessInfoArrayList.get(i), qualificationClassificationArrayList.get(i), trainingInfoArrayList.get(i));
} @Transactional(rollbackFor = Exception.class)
public String insertOrUpdateByOnce(EducationInfo educationInfo, BeforeEntry beforeEntry, AfterEntry afterEntry, EducationExperience educationExperience, AssessInfo assessInfo,
QualificationClassification qualificationClassification, TrainingInfo trainingInfo) { try {
//这里写核心业务方法
} catch (Exception e) {
log.error("插入或者修改异常");
//失败则手动回滚
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
//返回异常信息
return e.getCause().getMessage();
} return "success"; }

catch中加上手动回滚 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(),事务也没有生效,且报错

org.springframework.transaction.NoTransactionException: No transaction aspect-managed TransactionStatus in scope
at org.springframework.transaction.interceptor.TransactionAspectSupport.currentTransactionStatus(TransactionAspectSupport.java:122)
at com.dubboconsumer.dubboConsumer.service.imp.DemoService.B(DemoService.java:44)
at com.dubboconsumer.dubboConsumer.service.imp.DemoService.A(DemoService.java:20)
at com.dubboconsumer.dubboConsumer.service.imp.DemoService$$FastClassBySpringCGLIB$$c7449c96.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:669)
...

原因是:调用了同一个类的方法,给这个方法配上事务注解是不会生效的,这个类里面没有事务,不能进行手动回滚;Spring之所以可以对开启@Transactional的方法进行事务管理,是因为Spring为当前类生成了一个代理类,然后在执行相关方法时,会判断这个方法有没有@Transactional注解,如果有的话,则会开启一个事务;所以,要把执行事务的方法全部丢到一个service类,在这个service类上配上注解@Transactional(rollbackFor = Exception.class),则这个service类中所有的方法都是执行事务的管理

for (int i = 0; i < educationInfoArrayList.size(); i++) {
String result = insertOrUpdateEmployeeService.insertOrUpdateByOnce(educationInfoArrayList.get(i), beforeEntryArrayList.get(i), afterEntryArrayList.get(i), educationExperienceArrayList.get(i),
assessInfoArrayList.get(i), qualificationClassificationArrayList.get(i), trainingInfoArrayList.get(i));
}
@Repository
@Transactional(rollbackFor = Exception.class)
public class InsertOrUpdateEmployeeService { private static final Logger log = LoggerFactory.getLogger(InsertOrUpdateEmployeeService.class); @Autowired
private EmployeeDao employeeDao; public String insertOrUpdateByOnce(EducationInfo educationInfo, BeforeEntry beforeEntry, AfterEntry afterEntry, EducationExperience educationExperience, AssessInfo assessInfo,
QualificationClassification qualificationClassification, TrainingInfo trainingInfo) { try {
//这里写核心业务方法
} catch (Exception e) {
log.error("插入或者修改异常");
//失败则手动回滚
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
//返回异常信息
return e.getCause().getMessage();
} return "success"; }
}

这样就符合事务管理的要求了

注解@Transactional(rollbackFor = Exception.class) 的用法的更多相关文章

  1. Spring中的@Transactional(rollbackFor = Exception.class)属性详解

    序言 今天我在写代码的时候,看到了.一个注解@Transactional(rollbackFor = Exception.class),今天就和大家分享一下,这个注解的用法: 异常 如下图所示,我们都 ...

  2. spring的@Transactional(rollbackFor=Exception.class)的使用

    Spring框架的事务基础架构代码将默认地只在抛出运行时和unchecked exceptions时才标识事务回滚. 也就是说,当抛出个RuntimeException 或其子类例的实例时.(Erro ...

  3. @Transactional(rollbackFor = Exception.class)

    @Transactional(rollbackFor = Exception.class)这个注解只有在出异常时才会回滚,需要回滚时没有异常也要人为制造异常(自定义异常)所以,如果使用了异常捕获,很有 ...

  4. @Transactional(rollbackFor=Exception.class)的使用

    转载: java阿里巴巴规范提示:方法[edit]需要在Transactional注解指定rollbackFor或者在方法中显示的rollback. 先来看看异常的分类 error是一定会回滚的 这里 ...

  5. @Transactional(rollbackFor=Exception.class)的作用

    在项目中,@Transactional(rollbackFor=Exception.class),如果类加了这个注解,那么这个类里面的方 法抛出异常,就会回滚,数据库里面的数据也会回滚. 这种设置是因 ...

  6. coding++:Spring中的@Transactional(rollbackFor = Exception.class)属性详解

    异常: 如下图所示,我们都知道 Exception 分为 运行时异常 RuntimeException 和 非运行时异常. error 是一定会回滚的. 如果不对运行时异常进行处理,那么出现运行时异常 ...

  7. Spring中@Transactional(rollbackFor = Exception.class)的作用

    Spring中的@Transactional(rollbackFor = Exception.class)事务处理,当你的方法中抛出异常时,它会将 事务回滚,数据库中的数据将不会改变,也就是回到进入此 ...

  8. 为什么阿里规定需要在事务注解@Transactional中指定rollbackFor?

    作者:Mint6 来源:http://39sd.cn/53D5D Java阿里巴巴规范提示:方法[edit]需要在Transactional注解指定rollbackFor或者在方法中显示的rollba ...

  9. JPA的事务注解@Transactional使用总结

    在项目开发过程中,如果您的项目中使用了Spring的@Transactional注解,有时候会出现一些奇怪的问题,例如: 明明抛了异常却不回滚? 嵌套事务执行报错? ...等等 很多的问题都是没有全面 ...

随机推荐

  1. bootstrap简单使用实例

    表格实例,包含bootstrap.css 和 2.1.1jquery <!DOCTYPE html> <html> <head> <meta charset= ...

  2. digital envelope routines:EVP_DecryptFinal_ex:wrong final block length问题原因分析

    最近在做一个项目时,使用openssl中的aes进行加密和解密,使用相同的密钥但是出现下面的错误日志: 139868329146176:error:0606506D:digital envelope ...

  3. centos7设置rc.local开机执行命令

    在Centos7下,rc.local文件,开机默认是不执行的 它是个软链接 [root@data-1-1 ~]# ll /etc/rc.local lrwxrwxrwx. 1 root root 13 ...

  4. Java之Java7新特性之try资源句式

    一.原来写法: static String readFirstLineFromFile(String path) throws IOException { BufferedReader br = nu ...

  5. 精读《C++ primer》学习笔记(第四至六章)

    第四章: 重要知识点: 4.1 基础 函数调用是一种特殊的运算符,它对运算对象的数量没有限制. 重载运算符时可以定义运算对象的类型,返回值类型,但运算对象的个数,运算符的优先级,结合律无法改变. 当一 ...

  6. 工控随笔_03_西门子_Step7项目打开后CPU显示问号解决方法

    我们在利用西门子的S7-300/400 PLC的编程软件Step7的时候会出现下面如图所示的问题. 在打开项目的时候,我们会在Simatic Manager里面看到CPU以及一些其他一些组件显示问号. ...

  7. ECMA6 New Features

    花了一些时间把ECMA6的新特性进行了回顾,给自己建立了思维索引,大部分内容借鉴了阮一峰大神的博客. refers: http://es6.ruanyifeng.com/#docs/arraybuff ...

  8. 记一次gitlab-ce数据恢复过程

    使用的gitlab是用docker启动的,数据目录的owner/group信息被意外全部更改成了root:root导致服务不可用.最终通过复原文件所有者的方式恢复了服务. 步骤如下: 1. 打包备份g ...

  9. 正则求解@" (?<=^\[length=)(\d+)(?=\])"

    举个例子 [length=1548]这个正则 就是匹配 length的值了(1548)(?<=exp)匹配之后的(?=exp)匹配表达式之前的^是边界,在行首例如 aa[length=1548] ...

  10. 【转】redis实现的分布式锁

    参考: 1. https://www.bbsmax.com/A/WpdKpM1zVQ/ 2.https://www.oschina.net/translate/redis-distlock