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

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

 

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,一经查实,立即删除!

相关文章

Java连接PostgreSQL数据库,增删改查

https://blog.csdn.net/u013456370/article/details/79668420 通过eclipse工具&#xff0c;新建Maven项目&#xff1a; 添加&#xff1a;postgresql的jar包&#xff08;我使用的是&#xff1a;版本&#xff1a;42.2.2&#xff09; 修改pom.xml文件&#xff1a; <!-- https…

java打印九九乘法表——CSDN博客

/*** * Title: test_jiujiu* Description: 该方法的主要作用&#xff1a;九九乘法表* param 设定文件 * return 返回类型&#xff1a;void * throws*/Testpublic void test_jiujiu(){//打印九九乘法表for (int i 1; i < 10; i) {for (int j 1; j < i; j) {System…

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

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

MySQL中的共享锁与排他锁

转载自 MySQL中的共享锁与排他锁 在MySQL中的行级锁,表级锁,页级锁中介绍过&#xff0c;行级锁是Mysql中锁定粒度最细的一种锁&#xff0c;行级锁能大大减少数据库操作的冲突。行级锁分为共享锁和排他锁两种&#xff0c;本文将详细介绍共享锁及排他锁的概念、使用方式及注意事项…

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

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

java操作字符串——CSDN博客

/*** * Title: test_class_arrat* Description: 该方法的主要作用&#xff1a;* param 设定文件 * return 返回类型&#xff1a;void * throws*/Testpublic void test_is_equals(){//String str1new String("我爱祖国。");//String str2new String("我爱祖…

C#如何使用ES

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

MySQL中的读锁和写锁

转载自 MySQL中的读锁和写锁 在数据库的锁机制中介绍过&#xff0c;数据的锁主要用来保证数据的一致性的&#xff0c;数据库的锁从锁定的粒度上可以分为表级锁、行级锁和页级锁。在我的博客中重点介绍过MySQL数据库的行级锁。这篇文章主要来介绍一下MySQL数据库中的表级锁。 本…

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用于…

java向数组中插入元素

/*** * Title: test_insert_array* Description: 该方法的主要作用&#xff1a;像数组中插入元素* param 设定文件 * return 返回类型&#xff1a;void * throws*/Testpublic void test_insert_array(){Scanner scanner new Scanner(System.in);int [] list new …

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

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

Mysql中的行级锁、表级锁、页级锁

转载自 Mysql中的行级锁、表级锁、页级锁 在计算机科学中&#xff0c;锁是在执行多线程时用于强行限制资源访问的同步机制&#xff0c;即用于在并发控制中保证对互斥要求的满足。 在数据库的锁机制中介绍过&#xff0c;在DBMS中&#xff0c;可以按照锁的粒度把数据库锁分为行级…

Math中的常用方法

package educoder; public class MathTest{public static void main(String args[]){ /** *Math.sqrt()//计算平方根*Math.cbrt()//计算立方根*Math.pow(a, b)//计算a的b次方*Math.max( , );//计算最大值*Math.min( , );//计算最小值*/System.out.println(Math.sqrt(16)); //4…

Springmvc中提交from之后不跳转不进控制器

今天在自学springmvc之后写了一个简单的案例&#xff0c;可是不管怎么改都不进入控制器Controller&#xff0c;找了好久之后原来是粗心有个地方写错了&#xff0c;详情请往下看&#xff1a; 在springmvx-servlet.xml里面&#xff1a; <!-- 配置HandlerMapping映射&#xff…

asp.net core 认证及简单集群

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

Java开发2018年值得学习的10大技术

转载自 Java开发2018年值得学习的10大技术 作为一个开发人员&#xff0c;我们最大的挑战就是保持自己了解新的技术。技术变化很快,你大概每两年就会看到一个新版本的编程语言和框架。 就拿2017年来说&#xff0c;AR、VR、区块链、人工智能等等已经扑面而来了。除了这些离我们…

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;对此深有研究。 于是成小胖马上屁颠屁颠的跑过…