@Transactional事务不起作用原因

想必也有人遇到@Transactional事务不起作用,当时我遇到这个问题也很懵逼,明明别人的代码跟自己的一样,为什么别人的@Transactional事务起作用而自己的事务却没有起作用。如下举例子说明:
student1与student2要么全部录入成功,要么全部录入失败,但是我当时遇到的就是student1可以录入成录入功但是student2录入失败(故意把student2信息修改成录入错误的)。
@Service
public class StudentService {
@Autowired
private StudentRespository studentRespository;

  1. @Transactional
  2. public void insertTwo(){
  3. Student student1=new Student();
  4. student1.setName("n");
  5. student1.setAge(20);
  6. student1.setSex("nv");
  7. studentRespository.save(student1);
  8. Student student2=new Student();
  9. student2.setName("name2");
  10. student2.setAge(20);
  11. student2.setSex("nan");
  12. studentRespository.save(student2);
  13. }

}
经过一番折腾最后找到了原因,是因为数据库不支持事务,如果遇到这个问题首先去看看数据库是否支持事务管理。MySql举例子:Mysql修改支持事务的方法,

把引擎(也就是表类型)修改为InnoDB就ok了,在进行测试,事务起作用了。

下面方法供大家参考,楼主并未进行验证。
方案一:手动回滚。给注解加上参数如:@Transactional(rollbackFor=Exception.class)
方案二:如上述分析。MyException改为继承RuntimeException的异常。并且在service上层要继续捕获这个异常并处理
方案三:在service层方法的catch语句中增加:TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();语句,手动回滚,这样上层就无需去处理异常

原文地址:https://www.cnblogs.com/ming-blogs/p/10288951.html

时间: 2024-10-08 02:40:21

@Transactional事务不起作用原因的相关文章

Spring事务不起作用原因

首先声明: Checked异常继承java.lang.Exception类.Unchecked异常继承自java.lang.RuntimeException类. 而,Spring的事务实现采用基于AOP的拦截器来实现,如果没有在事务配置的时候注明回滚的checked exception, 那么只有在发生了unchecked exception的时候,才会进行事务回滚. 事务不起作用可能原因: 1.上述的异常问题. 2.方言问题. 3.MySQL引擎问题:MyISAM不支持事务. 4.hibern

aop声明式事务不起作用的原因

因为在业务层调用了 try{}catch(){} 并且异常没有在catch处抛出来,所以spring aop的事务不起作用 Spring AOP异常捕获原理:        被拦截的方法,须显式的抛出异常,且不能做任何处理,这样AOP才能捕获到方法中的异常,进而进行回滚.        换句话说,就是在Service层的方法中,不需要使用 try...catch  或者在catch中的最后加上 throw new RuntimeException(); 这样程序才会被AOP捕获,进而进行回滚.

Spring 事务不起作用的几种情况

1:必须是runtime异常,方法不要有try  catch语句. 2:service 中 @Service() public class AServiceImpl1 implements AService{ @Transactional(propagation = Propagation.REQUIRED) public void a() { this.b(); } @Transactional(propagation = Propagation.REQUIRES_NEW) public vo

@Transactional事务总结

一:加了注解@Transactional就能起作用的原理总结: 1:首先是由类:JdkDynamicAopProxy,在invoke方法里面创建动态代理类,同时由拦截类进行拦截,代码如下所示: List<Object> chain = this.advised.getInterceptorsAndDynamicInterceptionAdvice(method, targetClass);所有的注解都是放在Map里面,代码如下所示:Map<AdvisedSupport.MethodCac

SpringBoot整合Shiro 涉及跨域和@Cacheable缓存/@Transactional事务注解失效问题(五)

1. 跨域(多出现在前后端分离项目中) (1) 跨域介绍可参考:跨域(CORS) (2) SpringBoot中解决跨域方式有: A. 使用@CrossOrigin注解: B. 实现Filter类,重写doFilter方法 package com.ruhuanxingyun.config; import cn.hutool.core.util.StrUtil; import org.springframework.context.annotation.Configuration; import

Spring事务不起作用 问题汇总

Spring事务不起作用 问题汇总 博客分类: spring杂谈 java开发常见问题分析 总有很多朋友询问spring事务不起作用怎么回事,这里我汇总下,欢迎补充: 1.首先使用如下代码 确认你的bean 是代理对象吗? AopUtils.isAopProxy() AopUtils.isCglibProxy() //cglib AopUtils.isJdkDynamicProxy() //jdk动态代理 如果不是 那么就是切入点配置出错了 或者如果你使用了springmvc,可能是contex

spring mvc + mybatis + spring aop声明式事务管理没有作用

在最近的一个项目中,采用springMVC.mybatis,发现一个很恼人的问题:事务管理不起作用!!网上查阅了大量的资料,尝试了各种解决办法,亦未能解决问题! spring版本:3.0.5 mybatis版本:3.2.2 1.applicationContext.xml配置: mvc + mybatis + spring aop声明式事务管理没有作用" title="spring mvc + mybatis + spring aop声明式事务管理没有作用">2.spr

[Java][Spring]Spring事务不起作用 问题汇总

[Java][Spring]Spring事务不起作用 问题汇总 http://blog.csdn.net/szwangdf/article/details/41516239

SpringMVC的拦截器不起作用原因

SpringMVC的拦截器不起作用原因如下图: 这是因为过滤器没有加上这条语句chain.doFilter(request,response);,加上就能进入springMVC的拦截器了,调这个问题整了一天,开始一直没找到原因.