ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

@Transactional 错误集锦以及如何正确使用

2021-11-16 11:02:29  阅读:146  来源: 互联网

标签:回滚 错误 Spring Transactional public void 集锦 class


图片

原理

@Transactional 是声明式事务管理 编程中使用的注解,通过Spring AOP在注解修饰方法的前后织入事务管理的实现语句,所以开发者只需要通过一个注解就能代替一系列繁琐的事务开始、事务关闭等重复性的编码任务。

添加位置

  • 接口实现类或接口实现方法上,而不是接口类中。

  • 访问权限:public 的方法才起作用。@Transactional 注解应该只被应用到 public 方法上,这是由 Spring AOP 的本质决定的。

  • 系统设计:将标签放置在需要进行事务管理的方法上,而不是放在所有接口实现类上:只读的接口就不需要事务管理,由于配置了@Transactional就需要AOP拦截及事务的处理,可能影响系统性能。

错误案例

1.同一个类中调用

public class A {
    
    public void methodA() {
        methodB();
        
        // 其他操作
    }

    @Transactional
    public void methodB() {
        // 写数据库操作
    }
    
}

上面案例是错误的基于Spring Aop的拦截机制,将会忽略事务。解决方式如下:

@Service@AllArgsConstructorpublic class A {        private B b;        public void methodA() {        b.methodB();        // 其他操作    }}@Servicepublic class B {
    @Transactional    public void methodB() {        // 写数据库操作    }    }

注意:这里的B类没有用@Autowrire,构造函数用Lombok的@AllArgsConstructor生成 自动注入了。

2. @Transactional修饰方法不是public

public class TransactionalMistake {
    
    @Transactional
    private void method() {
        // 写数据库操作
    }
    
}

这也是基于Spring AOP实现的注解所要满足的要求。这个最简单, 直接把方法访问类型改成public即可。

3. 不同的数据源

public class TransactionalMistake {

    @Transactional
    public void createOrder(Order order) {
        orderRepo1.save(order);
        orderRepo2.save(order);
    }

}

上面这个例子里的orderRepo1和orderRepo2是连接的两个不同数据源。默认情况下,这种跨数据源的事务是不会成功的。如果要在多个数据源之间实现事务,那么可以引入JTA。

4. 回滚异常配置不正确

默认情况下,仅对RuntimeException和Error进行回滚。如果不是的它们及它们的子孙异常的话,就不会回滚。如果不是RuntimeException,但也希望触发回滚,那么可以使用rollbackFor属性来指定要回滚的异常。

public class TransactionalMistake {

    @Transactional(rollbackFor = XXXException.class)
    public void method() throws XXXException {

    }

}

5. 数据库引擎不支持事务

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

这里的spring.jpa.database-platform配置主要用来设置hibernate使用的方言。这里特地采用了MySQL5InnoDBDialect,主要为了保障在使用Spring Data JPA时候,Hibernate自动创建表的时候使用InnoDB存储引擎,不然就会以默认存储引擎MyISAM来建表,而MyISAM存储引擎是没有事务的。

图片

图片

点击下方卡片/微信搜索,关注公众号“天宇文创意乐派”(ID:gh_cc865e4c536b)

听说点赞和关注本号的都找到漂亮的小姐姐了哟且年后必入百万呀!!

标签:回滚,错误,Spring,Transactional,public,void,集锦,class
来源: https://blog.csdn.net/tuoni123/article/details/121351282

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有