`
BradyZhu
  • 浏览: 248094 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

全局事务与本地事务的区别应用

 
阅读更多
全局事务:资源管理器管理和协调的事务,可以跨越多个数据库和进程。资源管理器一般使用 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,那么全局事务就认为你这个事务是失败的,它就会进行回滚,回滚的时候,哪怕你的第二条语句在第一次提交的时候是成功的,它在第二次提交的时候也会回滚,那么第一次的更改也会恢复到之前的状态,这就是二次提交协议。(可以查看一下数据库方面的文档来了解二次提交协议)
分享到:
评论

相关推荐

    分布式事务思想和分布式系统入门.txt

    交易中间件与数据库通过 XA 接口规范,使用两阶段提交来完成一个全局事务, XA 规范的基础是两阶段提交协议。 第一阶段是表决阶段,所有参与者都将本事务能否成功的信息反馈发给协调者;第二阶段是执行阶段,协调者...

    springcloud seata-at linux普通 快速配置迁移

    分布式应用,每个单独的应用对应一个独立的数据源,每个服务内部的数据一致性由本地事务保证,但是全局数据一致性无法得到保障 Seata是alibaba开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简单易用...

    xaplus-engine:基于XA和XA +协议的事务处理引擎

    首先,要实现全局事务,引擎将与资源管理器通过XA协议(请参见1)配合使用,以控制应用程序事务的生命周期。 这是两阶段协议,其中包含准备事务和决定提交/回滚的步骤。 接下来,引擎使用XA +接口(请参阅2)与...

    经典JAVA.EE企业应用实战.基于WEBLOGIC_JBOSS的JSF_EJB3_JPA整合开发.pdf

    第4章 利用JDBC和JTA访问 数据库和管理全局事务 178 4.1 JDBC和容器管理的数据源 179 4.1.1 JDBC概述 179 4.1.2 使用JDBC执行数据库访问 180 4.1.3 使用WebLogic服务器管理的 数据源 182 4.1.4 使用JBoss服务器管理...

    SQL SERVER 2000开发与管理应用实例

    15.5.1 全局游标与本地游标 479 15.5.2 检查指定的游标是否存在 480 15.5.3 事务提交或者回滚对游标的影响 482 15.5.4 可更新的游标 483 15.6 SQL Server处理中的其他疑难解答 484 15.6.1 并发工作...

    seata-0.8.1:seata原始码解析-源码解析

    我们说,分布式事务是由一批分支事务组成的全局事务,通常分支事务只是本地事务。 Seata有3个基本组成部分: 事务协调器(TC):维护全局事务和分支事务的状态,驱动全局提交或回滚。 事务管理器TM:定义全局...

    seata:Seata是一种易于使用,高性能,开源的分布式交易解决方案

    我们说,分布式事务是由一批分支事务组成的全局事务,通常分支事务只是本地事务。 Seata有3个基本组件: 事务协调器(TC):维护全局事务和分支事务的状态,驱动全局提交或回滚。 事务管理器TM:定义全局事务的...

    JAVA设计模式之事务处理.pdf

    事务处理是企业应用需要解决的最主要的问题之一。J2EE通过JTA提供了完整的事务管理能力,包括多个事务性资 源的管理能力。但是大部分应用都是运行在单一的事务性资源之上...本地事务服务已然足够(比如JDBC事务管理)。

    Spring面试71题与答案

     事务管理:Spring提供一个持续的事务管理接口,可以扩展到上至本地事务下至全局事务(JTA)。  异常处理:Spring提供方便的API把具体技术相关的异常(比如由JDBC,HibernateorJDO抛出的)转化为一致的...

    全网最热spring问题总结.pdf

    总结了常见的spring面试题,方便学习者查漏补缺。...事务下至全局事务(JTA) 。 异常处理: Spring 提供方便的 API 把具体技术相关的异常(比如由 JDBC, Hibernate or JDO 抛出的) 转化为一致的 unchecked 异常。

    Java优化编程(第2版)

    Java优化编程(第2版)通过丰富、完整、富有代表性的实例,展示了如何提升Java应用性能,并且给出了优化前与优化后的Java应用程序的性能差别,以实际的实例与数字告诉你,为什么不可以这么做,应该怎么做,深入分析...

    分布式数据库系统复习题.doc

    站点自治性,也称为场地自治性,各站点上的数据由本地的DBMS管理,具有自治 处理能力,完成本站点的应用,这是分布式数据库系统与多处理机系统的区别。 另外,由以上三个分布式数据库系统的基本特点还可以导出它的...

    分布式数据库系统复习题(1).doc

    站点自治性,也称为场地自治性,各站点上的数据由本地的DBMS管理,具有自治 处理能力,完成本站点的应用,这是分布式数据库系统与多处理机系统的区别。 另外,由以上三个分布式数据库系统的基本特点还可以导出它的...

    超级有影响力霸气的Java面试题大全文档

    与cgi的区别在于servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet。...

    分布式数据库系统复习材料.doc

    否支持全局应用 (3)站点自治性:各站点上的数据由本地的DBMS管理,具有自治处理能力,完成本站点 的应用(局部应用),这是分布式数据库系统与多处理机系统的区别 11、数据分布透明性是指用户不必关心数据是如何被...

    C#微软培训资料

    2.2 公用语言运行时环境与公用语言规范.13 2.3 开 发 工 具 .17 2.4 小 结 .19 第三章 编写第一个应用程序 .20 3.1 Welcome 程序 .20 3.2 代 码 分 析 .20 3.3 运 行 程 序 .23 .4 添 加 注 释 .25 ...

    分布式数据库系统-复习.doc

    查询分解 数据本地化 全局优化 局部优化一个分布式事务通常是由 和 组成。 主事务 子事务 事务的四个特性是: 、 、 和 。 原子性 一致性 隔离性 耐久性 控制分布式事务所执行的控制模型有: 、 和 。 主从模型 ...

    spring.net中文手册在线版

    手动应用资源(“拉”模型的本地化) 19.6.4.在Web应用程序中进行图像本地化 19.6.5.全局资源 19.6.6.用户语言文化管理 19.6.6.1. DefaultWebCultureResolver 19.6.6.2. RequestCultureResolver 19.6.6.3. ...

Global site tag (gtag.js) - Google Analytics