当前位置: 首页 > 科技观察

Java中的事务——全局事务和局部事务

时间:2023-03-21 11:14:38 科技观察

上一篇文章讲过,Java事务分为三种:JDBC事务、JTA(JavaTransactionAPI)事务和容器事务。这是从事务实现的角度来区分的。本文从另一个角度区分Java中的事务。从事务管理的角度来看,Java中使用的事务可以分为本地事务和全局事务。本地事务不使用事务的编程框架来管理事务,而是直接使用资源管理器来控制事务。典型的是java.sql.Connection中的setAutoCommit、commit和rollback方法。本地事务优点支持严格的ACID属性可靠高效的状态只能在资源管理器中维护应用程序编程模型本地事务限制简单没有分布式事务处理隔离的最小单位由资源管理器决定,比如一个item在数据库中记录本地交易相对简单。对事务了解不多的同学可以在我的博客阅读其他关于事务的内容。全局事务我们之前介绍了本地事务。本地事务是我们在编程中经常接触到的事务,比如典型的jdbc操作,非常擅长保证ACID。但是本地事务无法解决分布式场景下的事务问题。在我之前的文章中,专门介绍了分布式场景下为什么需要事务。在这里,我将再回顾一下。典型的分布式事务场景转账是银行账户之间的转账问题。从A账户转账到B账户,在实现上一般可以分为“A账户扣钱”和“B账户加钱”两个步骤。大多数情况下,两个账户会被拆分到不同的数据库,更多的,两个操作会是两个服务调用。这两个操作需要同时成功或同时失败。因此引入了分布式事务问题。在电商网站下单时,消费者点击购买按钮后,交易后台会进行库存查询、下单、减库存、订单状态更新等一系列服务调用。每个操作对应一个独立的服务,而服务一般都有独立的数据库,所以会存在分布式事务问题。因为使用一个操作,写入数据的数据库不一致,或者调用的服务都是RPC服务,那么不能保证操作会在同一个事务中处理。所以会出现分布式事务的问题。全局事务的定义在上面的场景中,会出现分布式事务的问题,那么全局事务就是一个标准的分布式事务。下面我们尝试定义一个全局事务:全局事务是由资源管理器管理和协调的事务。全局事务是DTP模型事务。所谓DTP模型是指X/OpenDTP(X/OpenDistributedTransactionProcessingReferenceModel),它是由X/Open组织定义的一套分布式事务标准,即定义规范和API接口是规定,具体实施由生产厂家执行。X/OpenDTP定义了三个组件:AP、TM、RM和两个协议:XA、TXAP(ApplicationProgram):即应用程序,可以理解为使用DTP的程序RM(ResourceManager):资源管理器,这里可以理解为DBMS系统,或者消息服务器管理系统,应用程序通过资源管理器来控制资源。TM(TransactionManager):事务管理器负责协调和管理事务,提供AP应用程序编程接口和管理资源管理器。XA协议:应用程序或应用服务器与事务管理的接口TX协议:全局事务管理器与资源管理器的接口事务管理器控制全局事务,管理事务生命周期,协调资源。资源管理器负责控制和管理实际资源。这里还有一点要说,就是2PC(two-phasecommit)。在一个全局事务中,为了保证所有的操作可以一次提交或者全部失败。事务管理器和资源管理器之间事务操作的控制由2PC进行。关于2PC,我的博客里有一篇文章专门介绍,这里就不赘述了。J2EE中全局事务的实现Java本身提供了一些可用于实现全局事务的API。Java中的事务-JDBC事务中引入的JTA事务和JTA事务可用于在J2EE中实现全局事务。JTA(JavaTransactionAPI):用于应用程序、应用程序服务器和资源管理器的高级事务接口。JTS(JavaTransactionService):JTA事务管理器的实现标准,向上支持JTA,向下通过CORBAOTS实现跨事务域的互操作。EJB:一种基于组件的应用程序编程模型,通过声明式事务管理进一步简化事务应用程序的编程。全局事务的优缺点全局事务作为一种标准的分布式事务解决方案,解决了分布式场景下本地事务无法满足数据的ACID要求的问题。在关于分布式事务、两阶段提交协议、三阶段提交协议中,我介绍过2PC本身存在同步阻塞的问题,会导致效率低下。因此,使用2PC进行事务控制的全局事务也必然存在效率低下的问题。这也是全局事务最致命的缺点,在提倡微服务的今天是不能容忍的。小结本文主要介绍本地事务和全局事务。本地交易非常简单。JDBC可用于在Java中实现本地事务。全局事务是一种基本的分布式事务解决方案,是一种符合DTP模型的事务管理机制。目前越来越多的web开发涉及到分布式事务,尤其是最近微服务架构越来越流行。在微服务架构中,分布式事务是必须存在的。针对分布式事务的处理,本文主要介绍一个典型的解决方案——全局事务。但实际上,低效率的全局事务并不是很适合解决大型网站的分布式事务问题。在业界,主要用来解决分布式事务的方案是使用灵活事务。灵活的事务包括几种类型:两阶段、补偿、异步保证和尽力通知。后面我会在文章中继续介绍弹性事务。敬请关注。【本文为专栏作家霍利斯原创文章,作者微信公众号Hollis(ID:hollishuang)】点此阅读更多本作者好文