全局事务:资源管理器管理和协调的事务,可以跨越多个数据库和进程。资源管理器一般使用 XA 二阶段提交协议与“企业信息系统”(EIS) 或数据库进行交互。
本地事务:在单个 EIS 或数据库的本地并且限制在单个进程内的事务。本地事务不涉及多个数据来源。
在Hibernate配置文件中有这么两种配置方式:
1.如果使用的是本地事务(jdbc事务)
<property name="hibernate.current_session_context_class">thread</property>,这个是我们常用的选项,只针对一个数据库进行操作,也就是说只针对一个事务性资源进行操作.
2. 如果使用的是全局事务(jta事务)
<property name="hibernate.current_session_context_class">jta</property>
以前我们学习的事务类型都属于本地事务。 JTA(全局事务)和thread(本地事务)有什么区别呢?在某些应用场合,只能使用全局事务,比如:
有两个数据库:
1.mysql 2.oracle 现在有个业务需求--转账
step 1> update mysql_table set amount=amount-xx where id=aaa 发生扣钱,假设是在mysql数据库扣钱的。
step 2> update oracle_table set amount=amount+xx where id=bbb 加钱,假设是在oracle数据库扣钱的。
现在怎么确保两个语句在同一个事务里执行呢?
以前在JDBC里是这样做
connection = mysql 连接mysql
connection.setAutoCommit(false); 不自动提交
1> update mysql_table set amount=amount-xx where id=aaa 发生扣钱,假设是在mysql数据库扣钱的。
2> update oracle_table set amount=amount+xx where id=bbb 发生在oracle数据库
connection.commit();
执行这两条语句,然后通过connection对象提交事务.我们这样子做只能确保这两个语句在同一个数据库mysql里面实现在同一个事务里执行。 但是问题是我们现在是要连接到oracle数据库,是不是需要connection2啊?
connection = mysql 连接mysql
connection2 = oracle 连接oracle
connection.setAutoCommit(false); 不自动提交
1> update mysql_table set amount=amount-xx where id=aaa 发生扣钱,假设是在mysql数据库扣钱的。
2> update oracle_table set amount=amount+xx where id=bbb 发生在oracle数据库
connection.commit();
connection2.setAutoCommit(false);
connection2.commit();
事务只能在一个connection里打开,并且确保两条语句都在该connection里执行,这样才能让两条语句在同一事务里执行,现在问题就在于connection2是连接到oracle数据库的,那么connection2再开事务有意义吗?它能确保吗?不能,所以在这种情况下就只能使用全局事务了。
这种情况下用普通JDBC操作是满足不了这个业务需求的,这种业务需求只能使用全局事务,本地事务是无法支持我们的操作的,因为这时候,事务的生命周期不应该局限于connection对象的生命周期范围
全局事务怎么做呢?
JPA.getUserTransaction().begin(); 首先要全局事务的API,不需要我们编写,通常容器已经提供给我们了,我们只需要begin一下
connection = mysql 连接mysql
connection2 = oracle 连接oracle
connection--> update mysql_table set amount=amount-xx where id=aaa 发生扣钱,假设是在mysql数据库扣钱的。
connection2--> update oracle_table set amount=amount+xx where id=bbb 发生在oracle数据库
JPA.getUserTransaction().commit();
那么它是怎么知道事务该提交还是回滚呢?
这时候它使用了二次提交协议。二次提交协议简单说就这样:如果你先执行第一条语句,执行的结果先预提交到数据库,预提交到数据库了,数据库会执行这条语句,然后返回一个执行的结果,这个结果假如我们用布尔值表示的话,成功就是true,失败就是false.然后把执行的结果放入一个(假设是List)对象里面去,接下来再执行第二条语句,执行完第二条语句之后(也是预处理,数据库不会真正实现数据的提交,只是说这条语句送到数据库里面,它模拟下执行,给你返回个执行的结果),假如这两条语句的执行结果在List里面都是true的话,那么这个事务就认为语句是成功的,这时候全局事务就会提交。二次提交协议,数据库在第一次提交这个语句时,只会做预处理,不会发生真正的数据改变,当我们在全局事务提交的时候,这时候发生了第二次提交,那么第二次提交的时候才会真正的发生数据的改动。
如果说在执行这两条语句中,有一个出错了,那么List集合里就有个元素为false,那么全局事务就认为你这个事务是失败的,它就会进行回滚,回滚的时候,哪怕你的第二条语句在第一次提交的时候是成功的,它在第二次提交的时候也会回滚,那么第一次的更改也会恢复到之前的状态,这就是二次提交协议。(可以查看一下数据库方面的文档来了解二次提交协议)
分享到:
相关推荐
GTS旨在为企业级应用提供强一致性的全局事务解决方案,它支持跨数据库、跨服务的分布式事务处理,确保在分布式系统中的数据操作一致性,避免数据不一致和业务逻辑错误。这对于大规模分布式系统的高并发场景尤其重要...
全局事务服务(Global Transaction Service, 简称GTS)是阿里云专有云企业版中的一个重要组件,主要为企业级应用提供分布式环境下的强一致性事务处理能力。在V3.12.0版本中,GTS旨在解决在大规模分布式系统中出现的...
事务协调器负责管理全局事务的状态,资源代理则作为各个分布式组件与协调器之间的桥梁,而事务参与者则是实际执行事务操作的应用服务。 2. **事务处理机制** - **两阶段提交(2PC)**:GTS采用了经典的两阶段提交...
GTS采用了两阶段提交(2PC)和补偿事务(TCC)等分布式事务处理模式,结合本地事务和全局事务日志,实现事务的协调和回滚。同时,GTS还引入了事务超时、幂等性等机制来增强系统的稳定性和安全性。 5. **操作指南与...
本地事务通常与单一数据库连接相关联,它在单个数据库会话中执行所有操作。在Java中,我们可以使用JDBC的Connection对象的commit()和rollback()方法来手动管理事务,或者利用Java Transaction API (JTA)的...
中心协调器负责全局事务的管理和调度,而资源代理则驻留在各个分布式服务或数据库中,负责本地事务的提交和回滚。这种架构使得GTS可以透明地集成到现有的分布式系统中,降低了实施的复杂性。 3. **功能特性** - *...
Seata通过全局事务管理、本地事务协调以及事务资源管理等机制,实现了ACID(原子性、一致性、隔离性和持久性)的分布式事务特性。 1. **分布式事务挑战与Seata解决方式** 在分布式系统中,事务处理面临的主要挑战...
在这些场景中,事务模型如X/Open DTP模型被采用,它包括应用程序、资源管理器、事务管理器和通信资源管理,定义了全局事务树形结构。为了协调这些组件,有如XA规范这样的标准,以及2PC(两阶段提交)和3PC(三阶段...
一个全局事务包括多个本地事务,每个本地事务在各自数据库实例上执行。如果在执行过程中任何本地事务失败,全局事务管理器会协调所有本地事务进行回滚。 ### 后置执行功能 DRDS提供的后置执行功能是指在事务提交...
#### 四、本地事务与全局事务 - **本地事务**:在单个资源管理器中处理的事务。例如,在单个数据库中进行的所有操作组成一个事务。本地事务能够很好地支持ACID属性,并且相对高效可靠。 - **全局事务(DTP模型)**...
- 基于组件的应用编程模型,通过声明式事务管理进一步简化事务应用的编程。 #### 五、标准分布式事务解决方案的利弊分析 1. **优点**: - 严格的ACID一致性保障,适用于对数据一致性有极高要求的场景。 2. **...
Java的事务分为本地事务和全局事务。本地事务是通过设置JDBC连接的`setAutoCommit(false)`来手动开启的,所有在这个连接上的操作都将被包含在一个事务中,以确保ACID(原子性、一致性、隔离性和持久性)属性。全局...
2. **全局事务(DTP模型)**:为了协调多个服务之间的事务处理,可以引入全局事务管理器(TM)来管理整个事务生命周期。全局事务模型通过使用两阶段提交协议来保证所有参与者的协调一致。这种方式虽然能有效解决分布式...
8. 监控与管理:TX-LCN提供了监控台工具,可以查看全局事务的状态,便于排查问题和优化性能。 通过上述步骤,Spring Cloud应用能够轻松地实现分布式事务管理,提升了系统的可扩展性和稳定性。不过,值得注意的是,...
- **ResourceManager (RM)**:控制分支事务,负责分支注册、状态报告,并根据TC的指令驱动本地事务的提交或回滚。 #### Seata的执行流程 1. **开始全局事务**:TM向TC请求开始一个新的全局事务,TC创建全局事务并...
1. **Transaction Coordinator (TC):** 负责全局事务的协调工作,包括全局事务的状态管理、发起全局事务的提交或回滚操作。它是分布式事务的核心控制节点。 2. **Transaction Manager (TM):** 定义了全局事务的范围...
在传统的单体应用中,本地事务可以确保数据一致性,但在微服务场景下,随着服务拆分,每个服务可能拥有独立的数据源,这就导致了全局数据一致性难以保证,从而产生分布式事务问题。 分布式事务的基本概念是将一个...
下面我们将详细介绍分布式事务的概念、ACID特性、本地事务、全局事务、TX协议、XA协议、两阶段提交协议、BASE理论和CAP定理等关键概念。 一、事务的概念 事务是由一组操作构成的可靠的单元,事务具备ACID的特性,...