全局事务的提交

全局事务怎么做呢?
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,那么全局事务就认为你这
个事务是失败的,它就会进行回滚,回滚的时候,哪怕你的第二条语句在第一次提交的时候是成功的,它在第
二次提交的时候也会回滚,那么第一次的更改也会恢复到之前的状态,这就是二次提交协议。(可以查看一下
数据库方面的文档来了解二次提交协议)
MySQL全局事务是指在MySQL数据库中跨多个数据库连接或多个数据库实例执行的事务。它可以确保多个操作在一个事务中原子性地执行,要么全部成功,要么全部失败。 MySQL全局事务的实现主要依赖于两个特性:XA(eXtended Architecture)和两阶段提交(Two-Phase Commit)。 1. XA:XA是一种分布式事务协议,它定义了一组接口和协议,用于协调多个资源管理器(如数据库)之间的事务。在MySQL中,XA事务由XA接口和XA事务管理器来实现。通过XA接口,应用程序可以将多个数据库连接或多个数据库实例纳入到一个全局事务中。 2. 两阶段提交:两阶段提交是一种分布式事务协议,用于确保多个参与者(如数据库)在一个事务中的操作要么全部提交,要么全部回滚。它包含两个阶段: - 准备阶段:在这个阶段,协调者(通常是应用程序或事务管理器)会向所有参与者发送准备请求,并等待它们的响应。参与者会执行事务操作,并将操作结果和准备状态返回给协调者。 - 提交阶段:如果所有参与者都准备就绪,协调者会向它们发送提交请求,并等待它们的响应。参与者会执行提交操作,并将提交状态返回给协调者。如果有任何一个参与者无法提交,协调者会向所有参与者发送回滚请求,以确保事务的一致性。 通过XA和两阶段提交,MySQL全局事务可以实现跨多个数据库连接或多个数据库实例的事务一致性。但是需要注意的是,全局事务的性能开销较大,因为它需要进行多次网络通信和协调操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值