事务模型与分布式事务总结思考

转载自 事务模型与分布式事务总结思考

 

1. 介绍

之前了解过一些分布式事务处理的思想,包括MVCC、TCC等。但是对具体实现的规范和约束还不够理解清晰。本文从事务模型分类来讨论常见的事务模型。事务模型的含义,应该指的是我们如何去使用可控制事务。

首先通过以下一张PPT简单回顾下什么是事务:

2 本地事务模型

 

本地事务模型:不用事务的编程框架来管理事务,直接使用资源管理器来控制事务。典型的就是java.sql.Connection 中的 setAutoCommit、commit、rollback方法,见下面一段代码,直接使用资源管理器进行事务控制

    Connection conn = getConnection();conn.setAutoCommit(false);// do somethingboolean success = doSomething();if (success) {conn.commit();} else {conn.rollback();}```

3 编程式事务模型(JTA)

编程式事务模型:就是使用java提供的事务api JTA(Java Transaction API)
和事务服务提供者(一般是指j2ee容器) 进行事务控制,JTA里面提供了 java.transaction.UserTransaction ,里面定义了下面几个方法
begin:开启一个事务
commit:提交当前事务
rollback:回滚当前事务
setRollbackOnly:把当前事务标记为回滚
setTransactionTimeout:设置事务的事件,超过这个事件,就抛出异常,回滚事务
getStatus;

 

不过JTA只是提供了一个接口,并没有提供具体的实现,而是由j2ee服务器提供商 根据JTS规范提供的。下面一段代码演示了如何使用事务JPA:

 

    InitialContext ctx = new InitialContext();UserTransaction ut = (UserTransaction)ctx.lookup("javax.transaction.UserTransaction");ut.begin();//do somethingboolean isSuccess = doSomething() ;if(isSuccess){ut.commit();}else{ut.rollback();}

JPA规范里面定义了事务相关的几个角色:1. 事务上下文:事务状态和属性信息2. 资源管理器:数据库连接、JMS连接3. 通信管理器:用在分布式事务里面4. 应用程序:使用事务服务的程序5. 事务管理器:应用程序和事务服务提供者的api接口6. 事务服务提供者:实现了JTA规范的J2EE容器

这个是java里面JPA的规范,但是也有一些编程框架提供了自己的编程事务模型,例如java里最常用的就是spring的事务管理器,下面是spring提供的编程接口:org.springframework.transaction.PlatformTransactionManager,这里面就只有三个方法:

getTransaction:根据属性信息决定是否开启事务(具体可以看上一篇文章里面的事务特性小结里面的事务传播属性)

commit;提交当前事务

rollback;回滚当前事务

 

我们发现其实和JPA提供的编程模型很像,就是开启一个事务,提交还是回滚事务。spring提供的事务编程框架也比较简单

ApplicationContext context = getApplicationContext();TransactionTemplate transactionTemplate = (TransactionTemplate)context.getBean("TransactionTemplate");transactionTemplate.execute(new TransactionCallback() {public Object doInTransaction(TransactionStatus status) {boolean isSuccess = doSomething() ;if(isSuccess){}else{status.setRollbackOnly();}return isSuccess;}    });

4 声明式编程(JTA的变种)

 

声明式编程:这种编程模型不采用硬编码的方式,而是采用在xml里面进行配置的方式或者使用anotation的方式进行。例如srping里面可以通过aop进行实现。当然本质上也是属于JPA事务的。只不过对其做了一些分装。

 <bean id="accountService"
class="org.springframework.transaction.interceptor. TransactionProxyFactoryBean">
<property name="transactionManager" ref="transactionManager"/> 
<property name="target" ref="accountServiceTarget"/>
<property name="transactionAttributes">
<props><prop key="*">PROPAGATION_SUPPORTS</prop> <prop key="update*">PROPAGATION_REQUIRED </prop>
</props> 
</property>```

5. DTP事务模型
X/Open Distributed Transaction Processing (DTP) 事务模型实现了XA接口。XA事务指的是实现了XA接口符合DTP事务模型的事务。
DTP事务模型是X/Open 这个组织定义的一套分布式事务的标准,也就是了定义了规范和API接口,由这个厂商进行具体的实现。
DTP事务模型主要用于分布式事务

XA接口规范定义了以下几个组件:
1. 应用程序(AP):也就是应用程序,可以理解为使用DTP的程序
2.资源管理器(RM):资源管理器,这里可以理解为一个DBMS系统,或者消息服务器管理系统,应用程序通过资源管理器对资源进行控制。资源必须实现XA定义的接口
3.事务管理器(TM):事务管理器,负责协调和管理事务,提供给AP应用程序编程接口以及管理资源管理器

AP、RM、TM三者直接互相的协作关系用下图表示:
可以看到,其中TM 和 RM 通过XA接口进行双向通信。AP和TM、RM的通信接口规范没有约定,可以自己实现。

DTP定义的事务概念:
1. 事务:一个事务是一个完整的工作单元,由多个独立的计算任务组成,这多个任务在逻辑上是原子的。
2. 全局事务:对于一次性操作多个资源管理器的事务,就是全局事务
3. 分支事务:在全局事务中,某一个资源管理器有自己独立的任务,这些任务的集合作为这个资源管理器的分支任务
4. 控制线程:用来表示一个工作线程,主要是关联AP,TM,RM三者的一个线程,也就是事务上下文环境。简单的说,就是需要标识一个全局事务以及分支事务的关系。

 很多数据库都实现了DTP事务模型,用于支持分布式事务。
 
5.1 两阶段提交(2PC)
两阶段提交是DTP事务模型的一种实现方式。一个TM控制多个RM,协调资源。


两阶段主要指的是:
第一阶段(准备阶段):事务管理器通知资源管理器准备分支事务,资源管理器告之事务管理器准备结果
第二阶段(提交阶段):事务管理器通知资源管理器提交分支事务,资源管理器告之事务管理器结果

5.2 TCC
TCC是一种基于事务补偿(属于事后控制的策略,进行回滚)的模式,注意区别2PC
![](~/14-37-57.jpg)
 
TCC的执行过程

#6 跨域的DTP模型
需要RPC调用,有一些额外的问题。需要引入通信资源管理器。具体看下图:

 
参考资料:
http://www.cnblogs.com/aigongsi/archive/2012/10/09/2717372.html
http://www.cnblogs.com/lyhabc/p/4902341.html
http://wenku.baidu.com/view/be946bec0975f46527d3e104.html

 

 

 

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

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

相关文章

我的这10年——从机械绘图 到 炼油 到 微软MVP 的华丽转身

年底了&#xff0c;各种总结计划满天飞&#xff0c;有空的时候我也一直在思考这么多年&#xff0c;是怎么过来的。也曾经很迷茫&#xff0c;希望经验和经历能给大家一点带来一点正能量的东西。10年很长&#xff0c;10年前说实话我没有思考过现在的样子&#xff0c;但10年前的日…

基本类型和字符串互相转换

将基本数据类型转换成字符串 将字符串转换成基本数据类型

C#如何使用ES

Elasticsearch简介 Elasticsearch &#xff08;ES&#xff09;是一个基于 Lucene 的开源搜索引擎&#xff0c;它不但稳定、可靠、快速&#xff0c;而且也具有良好的水平扩展能力&#xff0c;是专门为分布式环境设计的。 Elasticsearch是什么 Elasticsearch是一个基于Apache Luc…

springboot中配置mybatis连接postgresql

https://blog.csdn.net/y_qc_lookup/article/details/80178545 springboot中配置mybatis连接postgresql 置顶 Dylans 2018-05-03 15:49:46 41415 收藏 8 分类专栏&#xff1a; java 文章标签&#xff1a; springboot mybatis postgresql xml 版权 最近在使用springboot用于…

CoreCLR源码探索(二) new是什么

前一篇我们看到了CoreCLR中对Object的定义&#xff0c;这一篇我们将会看CoreCLR中对new的定义和处理new对于.Net程序员们来说同样是耳熟能详的关键词&#xff0c;我们每天都会用到new&#xff0c;然而new究竟是什么&#xff1f; 因为篇幅限制和避免难度跳的太高&#xff0c;这一…

asp.net core 认证及简单集群

众所周知&#xff0c;在Asp.net WebAPI中&#xff0c;认证是通过AuthenticationFilter过滤器实现的&#xff0c;我们通常的做法是自定义AuthenticationFilter&#xff0c;实现认证逻辑&#xff0c;认证通过&#xff0c;继续管道处理&#xff0c;认证失败&#xff0c;直接返回认…

Could not open ServletContext resource [/WEB-INF/springmvc-servlet.xml]【解决方案】

第一次自学springmvc的时候&#xff0c;老是报错Could not open ServletContext resource [/WEB-INF/springmvc-servlet.xml]&#xff0c;郁闷的不要不要的。按照配置规则重新检查了一遍&#xff0c;没看出问题来&#xff0c;上网搜了一下说在web.xml里面加入: <servlet>…

成小胖学习微服务架构·基础篇

看到最近“微服务架构”这个概念这么火&#xff0c;作为一个积极上进的程序猿&#xff0c;成小胖忍不住想要学习学习。而架构师老王&#xff08;不是隔壁老王&#xff09;最近刚好在做公司基础服务的微服务化研究和落地&#xff0c;对此深有研究。 于是成小胖马上屁颠屁颠的跑过…

JDBC连接数据库教程,postgreSQL

https://blog.csdn.net/jg15617651654/article/details/63262456/ JDBC连接数据库教程&#xff0c;postgreSQL 流年你奈我何 2017-03-18 17:17:43 17389 收藏 4 分类专栏&#xff1a; Postgres 修炼之道 文章标签&#xff1a; postgresql 数据库 事务 jdbc 版权 0、概述 …

Springmvc入门案例(1)

据说&#xff0c;现在springmvc火了&#xff0c;好多企业都在使用&#xff0c;既然这样&#xff0c;咱们也得会点&#xff0c;于是乎就开始自学了&#xff0c;通过找资料&#xff0c;终于做出来了一个简单案例&#xff0c;这里分享供大家浏览&#xff0c;主要分为以下几个步骤&…

微软Project Springfield团队的F#使用心得

Project Springfield是一个用于在软件中查找关键安全错误的模糊测试服务。微软Springfield团队首席软件工程经理William Blum介绍了他们团队如何利用F#来构建云服务。 简洁性经常被认为是F#的主要优点之一。Blum提供了一些Project Springfield相关的数据&#xff1a; 为了移除一…

实现BUG自动检测 - ASP.NET Core依赖注入

我个人比较懒&#xff0c;能自动做的事绝不手动做&#xff0c;最近在用ASP.NET Core写一个项目&#xff0c;过程中会积累一些方便的工具类或框架&#xff0c;分享出来欢迎大家点评。 如果以后有时间的话&#xff0c;我打算写一个系列的【实现BUG自动检测】&#xff0c;本文将是…

玩转SpringBoot之定时任务详解

玩转SpringBoot之定时任务详解 https://www.cnblogs.com/mmzs/p/10161936.html 玩转SpringBoot之定时任务详解 阅读目录&#xff1a; 序言一、静态&#xff1a;基于注解二、动态&#xff1a;基于接口三、多线程定时任务阅读正文&#xff1a; 回到顶部 序言 使用SpringBoot创…

Java开发人员必知必会的20种常用类库和API

转载自 Java开发人员必知必会的20种常用类库和API 一个有经验的Java开发人员特征之一就是善于使用已有的轮子来造车。《Effective Java》的作者Joshua Bloch曾经说过&#xff1a;“建议使用现有的API来开发&#xff0c;而不是重复造轮子”。在本文中,我将分享一些Java开发人员应…

左耳朵耗子:不灌鸡汤,说真的年龄渐长,技术人的发展之路该怎么走

技术圈中的很多人&#xff0c;最初都坚定地认为coding能改变世界。然而三五年过去后&#xff0c;还能不忘初心的人&#xff0c;少之又少。随着年龄的增长&#xff0c;梦想已被束之高阁&#xff0c;面包慢慢占据生活的大部分。对于个人发展&#xff0c;很多成功学者会给你灌各种…