精华内容
下载资源
问答
  • Spring @Transactional注解不生效在spring mvc + mysql的项目中,使用Transactional的时候不回滚。在方法上加的是@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) 首先先检查了...

    Spring @Transactional注解不生效

    在spring mvc + mysql的项目中,使用Transactional的时候不回滚。

    在方法上加的是@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)

    1. 首先先检查了mysql的存储引擎是Innodb,支持事务的
    2. 然后不生效的原因可能就是配置不对了。查了Spring的官方文档之后,可以看到

      You can omit the transaction-manager attribute in the tag if the bean name of the PlatformTransactionManager that you want to wire in has the name transactionManager. If the PlatformTransactionManager bean that you want to dependency-inject has any other name, then you have to use the transaction-manager attribute explicitly, as in the preceding example.

      The @EnableTransactionManagement annotation provides equivalent support if you are using Java based configuration. Simply add the annotation to a @Configuration class. See the javadocs for full details.

      需要配置<tx:annotation-driven />元素或者使用java配置@EnableTransactionManagement

    spring boot中已经自动配置,自动配置的类是DataSourceTransactionManagerAutoConfiguration

    展开全文
  • 不生效场景一:try-catch捕获了 @Transactional public void transactionalNotEffect01() { try { Person p1 = new Person(); p1.setName(LocalDateTime.now().toString()); personDao.insertSelective(p1); ...

    源码下载

    https://github.com/cbeann/Demooo/tree/master/springboot-transactional-demo

    不生效场景1:try-catch捕获了

    不生效原因:内部逻辑把异常捕获,所以不生效

    @Transactional
     public void transactionalNotEffect01() {
        try {
          Person p1 = new Person();
          p1.setName(LocalDateTime.now().toString());
          personDao.insertSelective(p1);
          int i = 1 / 0;
        } catch (Exception e) {
          e.printStackTrace();
          System.out.println("my error");
        }
      }

    不生效场景2:方法不使用public修饰

    不生效原因:他会判断是不是public

    @Service
    public class StudentService {
    
      @Autowired private PersonDao personDao;
    
    
      // 不生效2
      @Transactional
      protected void transactionalNotEffect02() {
        Person p1 = new Person();
        p1.setName(LocalDateTime.now().toString());
        personDao.insertSelective(p1);
        int i = 1 / 0;
      }
      
    }
    
    @RestController
    public class TransactionalNotEffect02Controller {
    
      @Autowired private StudentService studentService;
    
      @GetMapping("/transactionalNotEffect02")
      public Object getAll(){
          studentService.transactionalNotEffect02();
        return 1;
      }
    }

     不生效场景3:通过this调用,没有走代理方法

     // 不生效3
      public void transactionalNotEffect03() {
        this.addPerson();
      }
    
      @Transactional
      public void addPerson() {
        Person p1 = new Person();
        p1.setName(LocalDateTime.now().toString());
        personDao.insertSelective(p1);
        int i = 1 / 0;
      }
    @RestController
    public class StudentController {
    
      @Autowired private StudentService studentService;
    
      @GetMapping("/transactionalNotEffect03")
      public Object transactionalNotEffect03() throws Exception {
        studentService.transactionalNotEffect03();
        return 1;
      }
    }
    

    不生效场景4:@Transactional 注解属性 propagation 设置错误

    参考:https://blog.csdn.net/sayoko06/article/details/79164858

    @Service
    public class StudentService {
    
      @Autowired private PersonDao personDao;
    
      // 不生效4
      @Transactional(propagation= Propagation.NOT_SUPPORTED)
      public void transactionalNotEffect04() {
        Person p1 = new Person();
        p1.setName(LocalDateTime.now().toString());
        personDao.insertSelective(p1);
        int i = 1 / 0;
      }
    }
    @GetMapping("/transactionalNotEffect04")
      public Object transactionalNotEffect04() throws Exception {
        studentService.transactionalNotEffect04();
        return 1;
      }

    不生效场景5:@Transactional的rollbackFor 属性设置为自定义异常,最后跑去其它异常

    没有测试出来(因此此处不贴代码)

    不生效场景6:数据库引擎不支持事务

    参考

    https://blog.csdn.net/sayoko06/article/details/79164858

    https://blog.csdn.net/qq_20597727/article/details/84900994

    展开全文
  • 1、在同一个类中,没有@Transactional注解的方法去调用有@Transactional注解 2、@Transactional注解修饰的方法不是public的 3、抛出的异常为checked类型 但今天比较倒霉了,@Transactional失效,都不是以上3个...

    1、在同一个类中,没有@Transactional注解的方法去调用有@Transactional注解

    2、@Transactional注解修饰的方法不是public的

    3、抛出的异常为checked类型

    但今天比较倒霉了,@Transactional失效,都不是以上3个原因。
    还原一下当时的情形:

    配置文件application.properties:

     

    spring.datasource.driver-class-name=com.mysql.jdbc.Driver
    spring.datasource.url=jdbc:mysql://127.0.0.1:3306/dbgirl?useUnicode=true&characterEncoding=UTF-8
    spring.datasource.username=root
    spring.datasource.password=123456
    spring.jpa.hibernate.ddl-auto=update
    spring.jpa.database-platform=org.hibernate.dialect.MySQL5Dialect
    

    User实体类:

     

    @Entity
    @Table(name = "users")
    public class User {
    
        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        private Long id;
    
        @Column(unique = true)
        private String name;
    
        private String company;
    
        // 略去getter,setter 
    }
    

    Service方法:

     

    @Component
    public class DemoService {
    
        @Autowired
        UserDao userDao;
    
        @Autowired
        OperationLogDao operationLogDao;
    
        @Transactional
        public void addUser(String name){
            OperationLog log = new OperationLog();
            log.setContent("create user:" + name);
            operationLogDao.save(log);
    
            User user = new User();
            user.setName(name);
            userDao.save(user);
        }
    
    }
    

    本来想的很好,利用jpa自动生成数据库表结构,方便向users表插入记录。当重复插入同一个name的User时,会报Duplicate entry 的错误,然后导致回滚,但结果并没有。
    后来搜了好久,才发现,mmp!

    数据库里表的引擎是MyISAM,不支持事务处理。。关键在于application.properties中这一行配置:

     

    spring.jpa.database-platform=org.hibernate.dialect.MySQL5Dialect
    

    将其修改如下

     

    spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
    

    再重新生成表后,引擎变为Innodb,再调用addUser方法,报错以后,事务终于回滚了



    作者:宁静的猫
    链接:https://www.jianshu.com/p/68e49a81a7fa
    来源:简书

    展开全文
  • 1.没有配置事务管理器。 2.在主方法(无@Transactional注解的方法)调用@Transactional事务注解子方法时,子方法的事务失效,注:事务可传递,在主方法上...4.数据库引擎不支持事务导致事务不生效 5.对check类型不...

    1.没有配置事务管理器。

    2.在主方法(无@Transactional注解的方法)调用@Transactional事务注解子方法时,子方法的事务失效,注:事务可传递,在主方法上加@Transactional即可,如果子方法在其他地方也有调用,都加上也可以

    3.@Transactional注解只能应用到 public 修饰的方法

    4.数据库引擎不支持事务导致事务不生效

    5.对check类型不生效,check类型异常这样注释@Transactional(rollbackOn = Exception.class)。

      换句话就是只对uncheck类型生效,运行异常。非RuntimeException不生效

    展开全文
  • @Transactional注解只能应用到public可见度的方法上,如果应用在protected、private或者package可见度的方法上,也不会报错,不过事务设置不会起作用。 2、检查你的异常类型是不是unchecked异常。默认情况下,Spring...
  • 1.spring-mvc.xml中是否扫描该路径&...2.注解功能是否启动&lt;tx:annotation-driven transaction-manager="txManager" /&gt;3.配置声明式事务管理&lt;bean id="txM...
  • 最近换了一份工作,公司用的SSM,在开发过程中发现了使用事务注解@Transactional无效,问了其他同事,貌似其他项目也是同样的问题…只好自己百度解决 网上有几种失效的原因,这里大致说一下 1. 配置文件未开启事务...
  • 在最近写的一个Springboot + shiro项目中,想在userService层加入事务,结果发现死活不生效 更奇怪的是,我在其他Service层加事务,100%有效! 在网上找了很多,都是些很基本的原因,后面再说怎么解决的,先把这些基本问题贴...
  • 1.数据库引擎支持事务 请看百度百科 InnoDB,是MySQL的数据库引擎之一,现为MySQL的默认存储引擎,为MySQL AB发布binary的标准之一。InnoDB由Innobase Oy公司所开发,2006年五月时由甲骨文公司并购。与传统的ISAM...
  • 在常规使用@transactional注解时,如果碰到不生效问题,要首先想到如下几个问题:  1. 如果是有关数据库操作,首先要查看牵涉到的表使用的引擎是什么引擎,要知道使用"MYISAM"数据库引擎是不支持事务回滚操作的,需要...
  • 最近这几天玩分布式事务的,使用 atomikos ,配置好 atomikos 后再Service层添加事务注解,可是一直有个问题,注解不生效。刚开始以为表不支持事务,可看了一下表类型是InnoDB ,是支持事务的。 后来我尝试通过...
  • 一、在springBoot使用事物时,发现事务并没有正常执行,没有... @Transactional public String addIncome1(@RequestParam("name") String name, @RequestParam("amount") double amount) { ...
  • SpringBoot @Transactional 注解生效

    千次阅读 2019-11-27 22:18:35
    @Transactional 注解生效的原因1. 数据库引擎支持事务2. @Transactional 修饰非 public 方法3. @Transactional 修饰的方法未通过接口调用4. @Transactional 修饰的方法内部捕获异常 1. Spring 中使用事务管理的...
  • 近期项目中遇到很多需要事务处理的逻辑,所以对@Transactional注解的作用条件测试了一番。 @Transactional注解是spring定义的一个注解,可以被子类继承,可以声明在类型、方法上,声明在类型时,可以看作给该类型下...
  • 方法添加了@Transactional注解,为什么事务不生效 二、步骤 测试用表结构 CREATE TABLE `test_aop` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(100) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE...

空空如也

空空如也

1 2 3 4 5 ... 19
收藏数 375
精华内容 150
关键字:

transactional注解不生效