@Transactional 注解失效问题

简介: @Transactional 注解失效问题

1. @Transactional 注解添加在非 public 修饰的方法上;


2. @Transactional 的 propagation 属性设置问题;


TransactionDefinition.PROPAGATION_SUPPORTS:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。


TransactionDefinition.PROPAGATION_NOT_SUPPORTED:以非事务方式运行,如果当前存在事务,则把当前事务挂起。


TransactionDefinition.PROPAGATION_NEVER:以非事务方式运行,如果当前存在事务,则抛出异常。


3. @Transactional 注解属性 rollbackFor 设置错误;


rollbackFor 可以指定能够触发事务回滚的异常类型。Spring默认抛出了未检查unchecked异常(继承自 RuntimeException 的异常)或者 Error才回滚事务;其他异常不会触发回滚事务。如果在事务中抛出其他类型的异常,但却期望 Spring 能够回滚事务,就需要指定 rollbackFor属性。


4. 同一个类中方法调用,导致@Transactional失效;


比如有一个类Test,它的一个方法A,A再调用本类的方法B(不论方法B是用public还是private修饰),但方法A没有声明注解事务,而B方法有。则外部调用方法A之后,方法B的事务是不会起作用的。


5. 异常被你的 catch“吃了”导致@Transactional失效;


@Transactional
public Integer A() throws Exception {
    int insert = 0;
    try {
        CityInfoDict cityInfoDict = new CityInfoDict();
        cityInfoDict.setCityName("2");
        cityInfoDict.setParentCityId(2);
        /**
         * A 插入字段为 2的数据
         */
        insert = cityInfoDictMapper.insert(cityInfoDict);
        /**
         * B 插入字段为 3的数据
         */
        b.insertB();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

如果B方法内部抛了异常,而A方法此时try catch了B方法的异常,那这个事务就不会正常回滚。


6. 数据库引擎不支持事务。


推荐写法:service 层不使用 try catch ,在 controller 层去使用。

相关文章
|
9月前
|
运维 监控 数据可视化
故障发现提速 80%,运维成本降 40%:魔方文娱的可观测升级之路
魔方文娱携手阿里云构建全栈可观测体系,实现故障发现效率提升 80%、运维成本下降 40%,并融合 AI 驱动异常检测,迈向智能运维新阶段。
724 78
|
9月前
|
运维 应用服务中间件 网络安全
配置管理这点事:从“人肉运维”到“一键交付”,Ansible/Puppet 到底牛在哪?
配置管理这点事:从“人肉运维”到“一键交付”,Ansible/Puppet 到底牛在哪?
279 9
|
运维 应用服务中间件 nginx
docker运维查看指定应用log文件位置和名称
通过本文的方法,您可以更高效地管理和查看Docker容器中的日志文件,确保应用运行状态可控和可监测。
2850 28
|
SQL 存储 关系型数据库
SQL自学笔记(3):SQL里的DCL,DQL都代表什么?
本文介绍了SQL的基础语言类型(DDL、DML、DCL、DQL),并详细说明了如何创建用户和表格,最后推荐了几款适合初学者的免费SQL实践平台。
834 3
SQL自学笔记(3):SQL里的DCL,DQL都代表什么?
|
Java 数据库连接 mybatis
|
SQL Java 数据库
Transactional注解讲解及使用
事务是数据库操作的一组集合,它作为一个工作单元,要求所有操作要么全部成功,要么全部失败。事务的四个基本特性是原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。
|
开发框架 前端开发 JavaScript
移动应用开发新趋势:跨平台框架对比
【6月更文挑战第27天】移动应用开发趋势转向跨平台框架,如Flutter(Google,Dart,快速开发,精美UI)、React Native(Facebook,JavaScript,庞大社区,原生模块支持)、Xamarin(C#,代码共享,.NET库)、NativeScript(原生渲染,Angular/Vue支持)。选择框架时需考虑项目需求、团队技能和性能要求。
1038 3
|
安全 Java 开发者
开发者必看!@Resource与private final的较量,Spring Boot注入技巧大揭秘,你不可不知的细节!
【8月更文挑战第29天】Spring Boot作为热门Java框架,其依赖注入机制备受关注。本文通过对比@Resource(JSR-250规范)和@Autowired(Spring特有),并结合private final声明的字段注入,详细探讨了两者的区别与应用场景。通过示例代码展示了@Resource按名称注入及@Autowired按类型注入的特点,并分析了它们在注入时机、依赖性、线程安全性和单一职责原则方面的差异,帮助开发者根据具体需求选择最合适的注入策略。
1030 0
|
消息中间件 存储 负载均衡
一文总结 MetaQ/RocketMQ 原理
本文介绍的 MetaQ/RocketMQ 是侧重于维持消息一致性和高可靠性的消息队列中间件,帮助大家对队列设计的理解。
|
算法 数据库
Mybatis-Plus实现常规增删改操作
Mybatis-Plus实现常规增删改操作
487 0

热门文章

最新文章