全局事务 与 本地事务

全局事务 - 资源管理器管理和协调的事务,可以跨越多个数据库和进程。资源管理器一般使用 XA 二阶段提交协议与“企业信息系统”(EIS) 或数据库进行交互。

·   本地事务 - 在单个 EIS 或数据库的本地并且限制在单个进程内的事务。本地事务不涉及多个数据来源。

本地和全局事务都使用 javax.transaction.UserTransaction 接口划分界限,客户端必须使用此接口。本地事务不使用事务管理器,因而处理速度更快。

起初,所有事务都是本地的。如果非 XA 数据源连接是事务范围中登记的第一个资源连接,当“另一个”XA 数据源连接加入此连接时,该非 XA 数据源连接就成为全局事务。如果另一个非 XA 数据源连接试图加入,就会产生异常。

J2EE开发者有两个事务管理的选择: 全局 或 本地 事务。全局事务由应用服务器管理,使用JTA。局部事务是和资源相关的,比如一个和JDBC连接关联的事务。这个选择有深刻的含义。例如,全局事务可以用于多个事务性的资源(典型例子是关系数据库和消息队列)。使用局部事务,应用服务器不需要参与事务管理,并且不能帮助确保跨越多个资源(需要指出的是多数应用使用单一事务性的资源)的事务的正确性。

全局事务.  全局事务有一个重大的缺陷,代码需要使用JTA:一个笨重的API(部分是因为它的异常模型)。此外,JTA的UserTransaction通常需要从JNDI获得,这意味着我们为了JTA,需要 同时 使用JNDI 和 JTA。显然全部使用全局事务限制了应用代码的重用性,因为JTA通常只在应用服务器的环境中才能使用。 以前,使用全局事务的首选方式是通过EJB的 CMT(容器管理事务):CMT是 声明式事务管理 的一种形式(区别于 编程式事务管理)。EJB的CMT不需要任何和事务相关的JNDI查找,虽然使用EJB本身肯定需要使用JNDI。它消除了大多数(不是全部)硬编码的方式去控制事务。重大的缺陷是CMT绑定在JTA和应用服务器环境上,并且只有我们选择使用EJB实现业务逻辑,或者至少处于一个事务化EJB的外观(Facade)后才能使用它。EJB有如此多的诟病,尤其是存在其它声明式事务管理时,EJB不是一个吸引人的建议。

本地事务. 本地事务容易使用,但也有明显的缺点:它们不能用于多个事务性资源。例如,使用JDBC连接事务管理的代码不能用于全局的JTA事务中。另一个缺点是局部事务趋向于入侵式的编程模型

### 配置和使用Spring中的全局事务管理 在现代企业级应用开发中,分布式系统的普及带来了新的挑战——跨多个数据源或服务的一致性和原子性需求。为了满足这一需求,在Spring框架内可以通过集成特定的技术来实现全局事务管理。 #### 使用Seata作为分布式事务解决方案 Seata是一个开源的分布式事务解决方案,能够很好地与Spring Cloud生态融合,支持多种模式下的分布式事务处理[^2]。 对于基于Spring的应用程序而言,要启用并配置全局事务管理,通常涉及以下几个方面: - **引入依赖** 首先需要确保项目包含了必要的库文件。如果采用Maven构建工具,则可以在`pom.xml`中加入如下依赖项: ```xml <dependency> <groupId>io.seata</groupId> <artifactId>seata-spring-boot-starter</artifactId> <version>${seata.version}</version> </dependency> ``` - **配置TM(Transaction Manager)和服务端地址** 接着需设置事务协调者(TM),即Seata Server的位置以及一些基本参数。这一般通过修改项目的application.yml或者properties文件完成: ```yaml spring: cloud: alibaba: seata: tx-service-group: my_test_tx_group # 定义事务组名称 seata: enabled: true service: vgroup-mapping.my_test_tx_group: default # 映射到默认的服务分组 grouplist.default: "127.0.0.1:8091" # Seata server 的 IP 和端口 ``` - **定义RM(Resource Manager)** 资源管理者(RM)负责管理和控制本地事务参与者的行为。当应用程序启动时会自动注册成为某个事务组的一部分。此过程不需要额外编码干预,只需保证数据库驱动已正确加载即可。 - **编写业务逻辑代码** 最后一步是在具体的业务场景里声明式地标记哪些方法应该参与全局事务。可以利用@Transactional注解简化这项工作: ```java @Service public class OrderService { @Autowired private OrderRepository orderRepo; @Transactional(rollbackFor = Exception.class, value="my_test_tx_group") public void placeOrder(OrderDTO dto){ // 执行订单创建流程... orderRepo.save(dto); // 假设这里调用了其他微服务接口 throw new RuntimeException("模拟异常"); } } ``` 上述例子展示了如何在一个简单的下单过程中运用全局事务特性。即使发生错误也能保证整个交易要么全部成功提交,要么完全撤销更改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值