Java中的事务——全局事务与本地事务

转载自   Java中的事务——全局事务与本地事务

在上一篇文章中说到过,Java事务的类型有三种:JDBC事务、JTA(Java Transaction API)事务、容器事务。

这是从事务的实现角度区分的,本文从另外一个角度来再次区分一下Java中的事务。站在事务管理的角度,可以把Java中用到的事务分为本地事务和全局事务。

本地事务

不用事务的编程框架来管理事务,直接使用资源管理器来控制事务。典型的就是java.sql.Connection 中的 setAutoCommitcommitrollback方法。之前我们介绍的JDBC事务就是一个非常典型的本地事务。本地事务也是我们日常开发中最经常使用的事务。

本地事务的优点

  • 支持严格的ACID属性

  • 可靠

  • 高效

  • 状态可以只在资源管理器中维护

  • 应用编程模型简单

本地事务的局限

  • 不具备分布式事务处理能力

  • 隔离的最小单位由资源管理器决定,如数据库中的一条记录

本地事务比较简单,基本原理就是数据库的事务原理。对事务不太了解的同学可以阅读我的博客中其他关于事务的内容。

 

全局事务

前面我们介绍了本地事务,本地事务是我们在编程中比较常接触的事务,比如典型的jdbc操作,在保证ACID方面做的非常出色。但是本地事务无法解决分布式场景中的事务问题。

我关于分布式一致性的探究专门介绍过分布式场景中为什么需要事务。这里我再稍微回顾一下。

典型的分布式事务场景

  • 转账

    • 对于银行账户间转账的问题。账户A向账户B转账,从实现上来看,一般可以拆分为“从账户A中扣钱”、“向账户B中加钱”两个操作步骤,两个账户大多数情况下会被切分到不同的数据库上,更多的是,两个操作会是两次服务调用。这两个操作要求做到要么同时成功、要么同时失败。因此引入了分布式事务问题。

  • 下单

    • 在电商网站上,在消费者点击购买按钮后,交易后台会进行库存检查、下单、减库存、更新订单状态等一连串的服务调用,每一个操作对应一个独立的服务,服务一般会有独立的数据库,因此会产生分布式事务问题。

由于用一次操作,数据要写入的数据库不一致,或者调用的服务都是RPC服务,那么就会无法保证操作在同一个事务中被处理掉。所以就会存在分布式的事务问题。

全局事务的定义

在上面的场景中会出现分布式事务问题,那么全局事务就是一个标准的分布式事务。下面我们尝试着给全局事务下一个定义:

全局事务是由资源管理器管理和协调的事务。

全局事务是一个DTP模型的事务,所谓DTP模型指的是X/Open DTP(X/Open Distributed Transaction Processing Reference Model),是X/Open 这个组织定义的一套分布式事务的标准,也就是了定义了规范和API接口,由这个厂商进行具体的实现。

X/Open DTP 定义了三个组件:APTMRM 和两个协议:XATX

AP(Application Program):也就是应用程序,可以理解为使用DTP的程序

RM(Resource Manager):资源管理器,这里可以理解为一个DBMS系统,或者消息服务器管理系统,应用程序通过资源管理器对资源进行控制。

TM(Transaction Manager):事务管理器,负责协调和管理事务,提供给AP应用程序编程接口以及管理资源管理器。

XA协议:应用或应用服务器与事务管理之前通信的接口

TX协议:全局事务管理器与资源管理器之间通信的接口

事务管理器控制着全局事务,管理事务生命周期,并协调资源。资源管理器负责控制和管理实际资源。

这里还要提到一个点,就是2PC(两阶段提交),在全局事务中,为了保证所有的操作可以一次性要么全提交,要么全失败。事务管理器和资源管理器之间的事务操作的控制是采用2PC来进行的,关于2PC,我博客中有文章专门介绍,这里不再赘述。

J2EE中全局事务的实现

Java自身提供了一些API可以用来实现全局事务。Java中的事务——JDBC事务和JTA事务中介绍的JTA事务就可以用来实现J2EE中的全局事务。

JTA(Java Transaction API):面向应用、应用服务器与资 源管理器的高层事务接口。

JTS(Java Transaction Service):JTA事务管理器的实现标 准,向上支持JTA,向下通过CORBA OTS实现跨事务域的互 操作性。

EJB:基于组件的应用编程模型,通过声明式事务管理进一步 简化事务应用的编程。

全局事务的优缺点

全局事务,作为一种标准的分布式事务解决方案,他解决了本地事务无法满足分布式场景中数据的ACID的要求。

在关于分布式事务、两阶段提交协议、三阶提交协议中我曾经介绍过,2PC本身是存在同步阻塞问题,这就会导致效率变低,所以,采用2PC进行事务控制的全局事务也必然存在效率低的问题。这也是全局事务最致命的缺点,在提倡微服务的今天,这是不能容忍的。

 

总结

本文主要介绍了本地事务和全局事务,本地事务很简单,在Java中可以使用JDBC来实现本地事务,全局事务是一种基本的分布式事务解决方案,是符合DTP模型的事务管理机制。

目前,越来越多的web开发要涉及到分布式事务,尤其是微服务架构最近越来越火,在微服务架构中,分布式事务是必然存在的。对于分布式事务的处理,本文主要介绍了一个典型的方案——全局事务。但是实际上,低效率的全局事务并不是很适合用来解决大型网站的分布式事务问题。

在业内,主要用来解决分布式事务的方案是使用柔性事务。柔性事务包括几种类型:两阶段型、补偿型、异步确保型和最大努力通知型。后面我会有文章继续介绍柔性事务。请继续关注。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/324703.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SSM整合简单登录案例

[1] 在数据库中创建用户信息表 [2] 搭建SSM开发环境 使用idea创建登录功能的web项目 在web-inf目录下创建lib文件夹&#xff0c;并导入SSM的jar包. 在src下创建MVC的包结构 在src下创建并配置SSM的xml文件 ① applicationcontext.xml <?xml version"1.0"…

19级、20级:班级日常分享,一天一瞬间

点击上方蓝色关注我们&#xff01;由于近期班级里面总是有或大或小的问题&#xff0c;所以就和丁老师商量的制定了长达29条的班规&#xff0c;昨天利用下午上课的时间在班内逐条讲解。因为班规是以安全、学习、道德以及身心健康为中心出发的&#xff0c;所以条条都合理&#xf…

同步VS异步

同步异步 &#xff0c; 举个例子来说&#xff0c;一家餐厅吧来了5个客人&#xff0c;同步的意思就是说&#xff0c;来第一个点菜&#xff0c;点了个鱼&#xff0c;好&#xff0c; 厨师去捉鱼杀鱼&#xff0c;过了半小时鱼好了给第一位客人&#xff0c;开始下位一位客人&#xf…

面向 Visual Studio 开发者的 Git 内部源代码

在我撰写的 Git DevOps 文章 (msdn.com/magazine/mt767697) 中&#xff0c;我介绍了 Git 版本控制系统 (VCS) 与可能已经很熟悉的集中式 VCS 的区别。然后&#xff0c;我演示了如何在 Visual Studio 中使用 Git 工具完成一些 Git 任务。在本文中&#xff0c;我将汇总 Git 在新发…

Intellij IDEA神器居然还有这些小技巧

转载自 Intellij IDEA神器居然还有这些小技巧 Intellij IDEA真是越用越觉得它强大&#xff0c;它总是在我们写代码的时候&#xff0c;不时给我们来个小惊喜。出于对Intellij IDEA的喜爱&#xff0c;我决定写一个与其相关的专栏或者系列&#xff0c;把一些好用的Intellij IDE…

SpringMVC中使用作用域对象完成数据的流转

文章目录SpringMVC中使用作用域对象完成数据的流转[1] 作用域对象复习[2] SpringMVC中使用作用域对象流转数据[3] SpringMVC的Model对象的使用SpringMVC中使用作用域对象完成数据的流转 [1] 作用域对象复习 PageContext对象 作用域范围:当前jsp页面内有效request对象 作用域范…

为什么总是喜欢看我桌面呢?

点击上方蓝色关注我们&#xff01;每天上课&#xff0c;尤其是19级&#xff0c;在刚刚连接上投影仪的那一瞬间&#xff0c;差不多50双眼睛盯着我的桌面看&#xff0c;由于桌面上的字比较小&#xff0c;所以大家眼睛都不带的眨一下的。我的桌面也没啥好看的呀&#xff0c;不就是…

原码,反码,补码

原码就是符号位加上真值的绝对值&#xff0c; 即用第一位表示符号&#xff0c; 其余位表示值。 反码的表示方法是:正数的反码是其本身&#xff1b;负数的反码是在其原码的基础上&#xff0c; 符号位不变&#xff0c;其余各个位取反。 补码的表示方法是:正数的补码就是其本身&am…

【2018.3.10】模拟赛之三-ssl2576 平台

目录地址 前言 水题不想说&#xff0c;连自带快排都懒得用了 正题 有n个平台&#xff0c;每个平台头尾有两根柱子支撑到地板或另一个平台上&#xff0c;求支撑平台需要的柱子数 输入输出&#xff08;需要自取&#xff09; Input 输入文件platforme.in第一行包括1个整数N…

再谈消息队列技术

上周&#xff0c;我们举办了第二届技术沙龙&#xff0c;我这边主要演讲了消息队列技术的议题&#xff0c;现分享给大家&#xff1a; 在我们团队内部&#xff0c;随着消息应用中心&#xff08;任务中心&#xff09;的广泛应用&#xff0c;有时候我们感觉不到消息队列的存在&…

20级:班级日常分享,一天一瞬间

点击上方蓝色关注我们&#xff01;今天批改的作业不仅仅是卡个印有“优”字样式的章&#xff0c;当然也不仅仅是用红笔写个“SSSS9.28”字样的批语了。除了给每个学生的作业本上都卡了“优”的章之外&#xff0c;还送给每位同学一句或长或短的话&#xff0c;有表扬有批评&#…

SpringMVC的视图解析器

文章目录SpringMVC的自定义视图解析器[1] SpringMVC的视图解析器[2] SpringMVC的自定义视图解析器SpringMVC自定义视图解析器的使用[1] 目前项目资源的声明位置和访问中存在的问题[2] 使用自定义视图解析器优化资源跳转路径[3] 使用restful声明公共单元方法请求转发WEB-INF下的…

互联网级监控系统必备-时序数据库之Influxdb技术

时间序列数据库&#xff0c;简称时序数据库&#xff0c;Time Series Database&#xff0c;一个全新的领域&#xff0c;最大的特点就是每个条数据都带有Time列。 时序数据库到底能用到什么业务场景&#xff0c;答案是&#xff1a;监控系统。 Baidu一下&#xff0c;互联网监控系…

存放80000000学生成绩的集合,怎么统计平均分性能高

大家好&#xff0c;我是雄雄&#xff0c;好久不介绍一下我&#xff0c;就被大家淡忘了……我们都知道&#xff0c;遍历集合的方式最常用的有两种&#xff0c;一种是使用下标的方式遍历&#xff0c;第二种便是使用foreach遍历&#xff0c;代码分别如下&#xff1a;使用下标的方法…

数组元素的默认值

数组元素的默认值 数组元素是整型&#xff1a;0 数组元素是浮点型&#xff1a;0.0 数组元素是char型&#xff1a;0或’\u0000’&#xff0c;而非’0’ 数组元素是boolean型&#xff1a;false 数组元素是引用数据类型&#xff1a;null eg 非数组元素必须初始化后才能进行使用…

如何重构箭头型代码

转载自 如何重构"箭头型"代码 本文主要起因是&#xff0c;一次在微博上和朋友关于嵌套好几层的if-else语句的代码重构的讨论&#xff0c;在微博上大家有各式各样的问题和想法。按道理来说这些都是编程的基本功&#xff0c;似乎不太值得写一篇文章&#xff0c;不过我…

SpringMVC的上传与下载

文章目录SpringMVC的上传SpringMVC的下载SpringMVC的上传 [1] 上传的功能需求 随着我们互联网的发展&#xff0c;我们的用户从直接访问网站获取信息。变为希望将自己本地的 资源发送给服务器&#xff0c;让服务器提供给其他人使用或者查看。还有部分的用户希望可以将 本地的资…

中秋节支付宝口令红包解析

大家好&#xff0c;我是雄雄。继上篇文章&#xff08;10.1日&#xff09;发完之后就没有再日更公众号了&#xff0c;给自己也放几天假。这个假期实在是太太太长了&#xff0c;放的我都心气憔悴&#xff01;出去玩吧&#xff0c;没地儿去&#xff0c;在家吧&#xff0c;除了看书…

asp.net core高级应用:TagHelper+Form

上一篇博客《asp.net core新特性(1):TagHelper》我讲解了TagHelper的基本用法和自定义标签的生成&#xff0c;那么我就趁热打铁&#xff0c;和大家分享一下TagHelper的高级用法~~&#xff0c;大家也可以在我的博客下随意留言。对于初步接触asp.net core的骚年可以看看我对TagHe…