开发者社区 > 云原生 > 中间件 > 正文

请问seata中, 注解连用时需要注意什么 ?

请问seata中,22. AT 模式和 Spring @Transactional 注解连用时需要注意什么 ?

展开
收起
十一0204 2023-07-05 21:22:51 63 0
3 条回答
写回答
取消 提交回答
  • 北京阿里云ACE会长

    AT 模式和 Spring @Transactional 注解连用时需要注意以下几点:

    需要将 Seata 的事务管理器配置为 Spring 的事务管理器
    在使用 Spring @Transactional 注解时,需要将 Seata 的事务管理器配置为 Spring 的事务管理器。具体来说,可以在 Spring 的配置文件中,配置一个 SpringTransactionManager 类型的 Bean,并将其注入到 Seata 的全局事务配置中。例如:

    angelscript
    Copy









    需要在 @Transactional 注解中指定事务管理器
    在使用 Spring @Transactional 注解时,需要在注解中指定事务管理器。具体来说,可以使用 transactionManager 属性来指定事务管理器的名称。例如:

    java
    Copy
    @Service
    public class MyService {

    @Autowired
    private MyRepository myRepository;

    @Transactional(transactionManager = "springTransactionManager")
    public void myMethod() {
    myRepository.updateData();
    }

    }
    需要将所有涉及到的 SQL 语句放在同一个本地事务中
    在使用 AT 模式时,需要将所有涉及到的 SQL 语句放在同一个本地事务中执行,以确保分布式事务的一致性。如果使用 Spring @Transactional 注解来管理本地事务,需要将所有涉及到的 SQL 语句放在同一个被注解的方法中,或者在被注解的方法中调用其他被注解的方法。例如:

    typescript
    Copy
    @Service
    public class MyService {

    @Autowired
    private MyRepository myRepository;

    @Transactional(transactionManager = "springTransactionManager")
    public void myMethod() {
    myRepository.updateData1();
    myRepository.updateData2();
    }

    @Transactional(transactionManager = "springTransactionManager")
    public void updateData1() {
    myRepository.updateData1();
    }

    @Transactional(transactionManager = "springTransactionManager")
    public void updateData2() {
    myRepository.updateData2();
    }

    }
    在上面的代码中,myMethod() 方法中的两个 SQL 语句都会在同一个本地事务中执行

    2023-07-29 09:03:12
    赞同 展开评论 打赏
  • 全栈JAVA领域创作者

    Seata 依赖 Spring 的注解机制,实现声明式事务,即开发者给 Bean 使用注解 ,Seata 通过重写此类 Bean 生命周期的三个阶段以完成分布式事务能力,这 3 步为:Bean 初始化阶段(afterPropertiesSet()``)初始化 TM RM 客户端,建立与 TC 的长连接Bean 初始化阶段(initialize()```)初始化全局事务管理器(TM),并将其注册到 Seata Server 中。

    AT 模式和 Spring @Transactional 注解连用时需要注意以下几点:

    • AT 模式需要在方法上加上 @GlobalTransactional 注解,而 Spring @Transactional 则需要在类或方法上加上 @Transactional 注解。
    • AT 模式需要手动开启和关闭全局事务,而 Spring @Transactional 则会自动开启和关闭全局事务。
    • AT 模式需要手动指定事务传播行为,而 Spring @Transactional 则会根据代码中的配置自动选择事务传播行为。
    2023-07-10 07:51:46
    赞同 展开评论 打赏
  • 意中人就是我呀!

    Transactional 可与 DataSourceTransactionManager 和 JTATransactionManager 连用分别表示本地事务和XA分布式事务,大家常用的是与本地事务结合。当与本地事务结合时,@Transactional和@GlobalTransaction连用,@Transactional 只能位于标注在@GlobalTransaction的同一方法层次或者位于@GlobalTransaction 标注方法的内层。这里分布式事务的概念要大于本地事务,若将 @Transactional 标注在外层会导致分布式事务空提交,当@Transactional 对应的 connection 提交时会报全局事务正在提交或者全局事务的xid不存在。此回答整理自钉群“3群-Seata 开源讨论群”。

    2023-07-05 21:44:35
    赞同 展开评论 打赏
问答分类:
问答地址:

为企业提供高效、稳定、易扩展的中间件产品。

相关电子书

更多
《Seata 1.3 新特性以及如何参与社区》 立即下载
低代码开发师(初级)实战教程 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载