全局事务与本地事务的区别应用(从代码方面来探讨的)

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

时间: 2024-09-29 07:52:15

全局事务与本地事务的区别应用(从代码方面来探讨的)的相关文章

全局和本地事务(从理论上)

全局和本地事务 ·   全局事务 - 资源管理器管理和协调的事务,可以跨越多个数据库和进程.资源管理器一般使用 XA二阶段提交协议与"企业信息系统"(EIS) 或数据库进行交互. ·   本地事务 - 在单个 EIS 或数据库的本地并且限制在单个进程内的事务.本地事务不涉及多个数据来源. 本地和全局事务都使用 javax.transaction.UserTransaction 接口划分界限,客户端必须使用此接口.本地事务不使用事务管理器,因而处理速度更快. 起初,所有事务都是本地的.如

JS本地刷新返回上一页代码_javascript技巧

长话短说,今天介绍实现此功能的一个方法,需要了解的朋友可以参考下: 一.JS 重载页面,本地刷新,返回上一页 代码如下: <a href="javascript:history.go(-1)">返回上一页</a> <a href="javascript:location.reload()">重载页面,本地刷新</a> <a href="javascript:history.go(-1);location

Oracle中会话与事务的区别

一个会话可以启动多个事务,会话是session,指一次连接. 事务是指一个操作单元,要么成功,要么失败,没有中间状态. 会话中可以完成多个事务. 例如: 会话好比,在应用程序中连接数据库要执行连接,然后会关闭,这算一次会话. 事务呢,就好比在打开会话后要执行程序中的某一个或多个对数据库进行的操作. 事物的最好例子就是转账,从一个账户赚钱到另一个账户,两张表的数据修改,要么全成功,要门全变回原样. 会话看 v$session 事务看 v$transaction 这两张视图通过 v$session.

hibernate的事务和spring事务的区别

对于传统的基于特定事务资源的事务处理而言(如基于JDBC的数据库访问),Spring并不会对其产生什么影响,我们照样可以成功编写并运行这样的代码.同时,Spring还提供了一些辅助类可供我们选择使用,这些辅助类简化了传统的数据库操作流程,在一定程度上节省了工作量,提高了编码效率. 对于依赖容器的参数化事务管理而言,Spring则表现出了极大的价值.Spring本身也是一个容器,只是相对EJB容器而言,Spring显得更为轻便小巧.我们无需付出其他方面的代价,即可通过Spring实现基于容器的事务

nodejs npm install全局安装和本地安装的区别_node.js

npm的包安装分为本地安装(local).全局安装(global)两种,从敲的命令行来看,差别只是有没有-g而已,比如: 复制代码 代码如下: npm install grunt # 本地安装npm install -g grunt-cli # 全局安装 下面分别解释. 1. npm install xxx -g 时, 模块将被下载安装到[全局目录]中. [全局目录]通过 npm config set prefix "目录路径" 来设置. 通过 npm config get prefi

赛思互动:浅析CRM Online与CRM本地部署的区别

对于企业来讲决定实施客户关系管理系统(CRM)解决方案是一件大事.但是决定实施CRM只是一个开始.下一步你需要确定什么样的CRM系统最适合你和你的团队.在CRM实施过程中最复杂的问题可以说是在云部署和本地部署解决方案中进行选择(如果不知道什么是云部署什么是本地部署请自行补脑).对于两种解决方案在过渡时间,功能完善性和延展性等问题的思考往往令人难解难分.不过一旦你做出了正确的决定,其他的过程会变得顺利得多,所以为了能够早日脱离苦海,踏上康庄大道,让我们马上开始吧! 不要为核心功能问题操心 不管你选

全局事务(JTA事务)的原子性

问题描述 现有两个事务资源datasource1,datasource2假如我不采用XA规范而是简单的try{do transaction 1;do transaction 2;commit transaction 1;//①commit transaction 2;//②}catch(exception){ rollback transaction 1; rollback transaction 2;}这样做是管理两个事务和通过X/OPEN XA(JTA)的两阶段提交有何区别.是不是JTA可以

IBM智慧的政府 从本地事务到国际合作

如何实现和加速"智慧地球"落地的问题被社会各界反复讨论.如何把智能融入到公共系统中?如何把所有相关环节和部门都集中起来?如何取得市民的理解和支持?从哪里开始做起?这些都不是技术问题.支持智慧地球的技术已经逐步成熟,现在需要的是社会的关注.各阶层的通力合作和资源的协调整合.领导力是引领智慧时代的推动力. 智慧地球发展进入http://www.aliyun.com/zixun/aggregation/17665.html">黄金十年,IBM 发表演讲"欢迎进入智慧

ASP本地图片,音乐等防盗代码

<%'定义函数,用ADODB.Stream读取二进制数据Function ReadBinaryFile(FileName)Const adTypeBinary = 1Dim BinaryStreamSet BinaryStream = CreateObject("ADODB.Stream")BinaryStream.Type = adTypeBinaryBinaryStream.OpenBinaryStream.LoadFromFile FileNameReadBinaryFil