请问seata中,22. AT 模式和 Spring @Transactional 注解连用时需要注意什么 ?
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 语句都会在同一个本地事务中执行
Seata 依赖 Spring 的注解机制,实现声明式事务,即开发者给 Bean 使用注解 ,Seata 通过重写此类 Bean 生命周期的三个阶段以完成分布式事务能力,这 3 步为:Bean 初始化阶段(afterPropertiesSet()``)初始化 TM RM 客户端,建立与 TC 的长连接Bean 初始化阶段(
initialize()```)初始化全局事务管理器(TM),并将其注册到 Seata Server 中。
AT 模式和 Spring @Transactional 注解连用时需要注意以下几点:
@GlobalTransactional
注解,而 Spring @Transactional 则需要在类或方法上加上 @Transactional
注解。Transactional 可与 DataSourceTransactionManager 和 JTATransactionManager 连用分别表示本地事务和XA分布式事务,大家常用的是与本地事务结合。当与本地事务结合时,@Transactional和@GlobalTransaction连用,@Transactional 只能位于标注在@GlobalTransaction的同一方法层次或者位于@GlobalTransaction 标注方法的内层。这里分布式事务的概念要大于本地事务,若将 @Transactional 标注在外层会导致分布式事务空提交,当@Transactional 对应的 connection 提交时会报全局事务正在提交或者全局事务的xid不存在。此回答整理自钉群“3群-Seata 开源讨论群”。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。