Seata AT 模式和 Spring @Transactional 注解连用时需要注意什么 ?
Seata AT 模式与 Spring @Transactional 注解连用时的注意事项:
Seata AT(Automatic Transaction)模式和Spring @Transactional 注解连用时,需要注意以下几点:
事务管理器配置:
seata-spring-boot-starter
依赖来自动处理数据源代理。注解使用位置:
@Transactional
注解通常用来管理本地数据库事务,而Seata AT模式下,全局事务由Seata服务端统一协调。在业务方法上同时使用时,要明白@Transactional
针对的是局部事务,而Seata是全局事务协调者,两者结合时,Seata会接管本地事务的生命周期。一阶段和二阶段提交:
@Transactional
来控制事务边界,因为Seata已经通过两阶段提交协议实现了分布式事务的完整性。避免嵌套事务问题:
@Transactional
注解的方法调用,由于Seata事务优先级较高,内部的Spring事务可能不会生效或者被合并到Seata的全局事务中。幂等性和异常处理:
隔离级别和传播属性:
@Transactional
注解中的隔离级别、传播属性等在分布式事务场景下可能需要特别关注,但Seata框架自身也提供了相应的分布式事务隔离能力,实际使用时需结合具体业务场景权衡是否需要在本地事务层面上调整这些属性。方法可见性:
@Transactional
注解只有在public可见的方法上才会生效,如果将此注解放在protected、private或其他非public修饰的方法上,则该事务注解不会产生作用。总之,在使用Seata AT模式时,Spring的@Transactional
注解更多地是对单体应用内数据库事务的一种辅助管理手段,而在分布式事务环境下,关键在于理解并配合Seata提供的全局事务管理机制。
@Transactional 可与 DataSourceTransactionManager 和 JTATransactionManager 连用分别表示本地事务和XA分布式事务,大家常用的是与本地事务结合。当与本地事务结合时,@Transactional和@GlobalTransaction连用,@Transactional 只能位于标注在@GlobalTransaction的同一方法层次或者位于@GlobalTransaction 标注方法的内层。这里分布式事务的概念要大于本地事务,若将 @Transactional 标注在外层会导致分布式事务空提交,当@Transactional 对应的 connection 提交时会报全局事务正在提交或者全局事务的xid不存在。
此回答整理自钉群“3群-Apache Seata(incubating) 开源讨论群”
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。