原文地址:http://原文地址:https://github.com/1991wangliang/transaction

基于Dubbo的分布式事务框架(LCN)

该框架依赖Redis/dubbo/txManager服务。依赖第三方框架lorne_core

原理与功能

基于对spring tx PlatformTransactionManager的本地模块事务控制从而达到全局控制事务的目的。该框架兼容任何依赖PlatformTransactionManager的DB框架。利用三阶段提交的方式来确保事务的一致性,支持本地事务和分布式事务框架共存,当方法进入的是本地事务方法,框架将不做任何分布式事务处理。当需要用到分布式事务的时候只需要在方法上添加分布式事务的注解即可。框架由于基于Spring本地事务做的封装,基本支持依赖spring的所有db框架。并在帖子底部提供了对springjdbc/hibernate/mybatis的演示demo。

该框架在设计时就考虑到大型分布式的应用场景,因此框架支持对于dubbo单个模块的集群化。并且TxManager也支持集群化。

框架基于三阶段提交:

锁定事务单元

确认事务模块状态

通知事务

关于LCN框架的详细设计请见txManager说明

框架使用教程

需要先部署redis服务。

部署TxManager全局事务协调管理器。

本地项目依赖transaction库.

maven仓库地址

<repositories>

<repository>

<id>lorne</id>

<url>https://1991wangliang.github.io/repository</url>

</repository>

</repositories>

maven transaction 配置

<dependency>

<groupId>com.lorne.tx</groupId>

<artifactId>transaction</artifactId>

<version>1.0.0.RELEASE</version>

</dependency>

配置dubbo服务

<dubbo:application name="tx-transaction-test"   />

<!--所有参与分布式事务的模块以及TxManager都必须要在同一个服务下-->

<dubbo:registry protocol="zookeeper" address="127.0.0.1:2181" />

<!--依赖TxManager服务-->

<dubbo:reference timeout="3000" interface="com.lorne.tx.mq.service.MQTxManagerService" id="managerService" />

<dubbo:protocol accesslog="true" name="dubbo" port="20882" />

<!--所有需要分布式事务的模块也都必须对外提供服务-->

<!--1. 用户自定义的服务-->

<dubbo:service interface="com.demo.service.MQTestService" ref="testService"  />

<bean id="testService" class="com.demo.service.impl.MQTestServiceImpl"   />

<!--2. 当用户没有需要对外提供的服务时-->

<!--<dubbo:service interface="com.lorne.tx.mq.service.MQTransactionService" ref="transactionService"  />-->

<!--<bean id="transactionService" class="com.lorne.tx.mq.service.impl.MQTransactionServiceImpl"   />-->

若用户是自定义的服务,则服务必须要实现MQTransactionService接口如下:

public interface MQTestService extends MQTransactionService{

String test(String name);

}

MQTransactionService的实现:第一种方式

@Service

public class MQTestServiceImpl extends MQTransactionServiceImpl implements MQTestService {

@Override

public String test(String name) {

//todo 用户业务处理

return "";

}

}

MQTransactionService的实现:第二种方式

@Service

public class MQTestServiceImpl implements MQTestService {

@Autowired

private MQTransactionService transactionService;

@Override

public boolean notify(String kid, boolean state) {

return transactionService.notify(kid, state);

}

@Override

public boolean checkRollback(String kid) {

return transactionService.checkRollback(kid);

}

@Override

public String test(String name) {

//todo 用户业务处理

return "";

}

}

分布式事务的切面配置

<!--本地事务manager  -->

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

<property name="dataSource" ref="dataSource"/>

</bean>

<!--本地事务切面 -->

<tx:annotation-driven transaction-manager="transactionManager"/>

<!--切面 advice 定义-->

<tx:advice id="txAdvice">

<tx:attributes>

<tx:method name="get*" read-only="true"  />

<tx:method name="find*" read-only="true"/>

<tx:method name="load*" read-only="true"/>

<tx:method name="query*" read-only="true"/>

<tx:method name="select*" read-only="true"/>

<tx:method name="*" rollback-for="com.le.core.framework.exception.LEException"/>

</tx:attributes>

</tx:advice>

<!--分布式事务拦截器-->

<bean id="txTransactionInterceptor" class="com.lorne.tx.interceptor.TxManagerInterceptor"/>

<aop:config>

<aop:pointcut id="allManagerMethod" expression="execution(* com.**.service.impl.*Impl.*(..))"/>

<!--本地事务拦截-->

<aop:advisor  order="100" advice-ref="txAdvice" pointcut-ref="allManagerMethod"/>

<!--分布式事务拦截-->

<aop:advisor  order="10" advice-ref="txTransactionInterceptor" pointcut-ref="allManagerMethod"/>

</aop:config>

分布式事务注解(@TxTransaction)

@Override

@TxTransaction

public String test() {

//todo 业务处理

return "";

}

关于@TxTransaction的补充说明: 当添加事务注解时方法将开启分布式事务处理方式。当尽当开始方法是分布式事务方法时才进入分布式事务处理逻辑。 若存在业务方法A调用了业务方法B,当分布式事务注解添加在A上,那么整个A方法将被分布式事务所管理,若注解添加在B上,当调用A时将不会被启用分布式事务,尽当业务启动时的方法添加分布式事务注解时方可开启分布式事务注解。

演示demo:

spring-jdbc版本: transaction_demo1 transaction_demo2

transaction_demo1是发起方,transaction_demo2是被调用方。

hibernate版本:

transaction_hibernate_demo1 transaction_hibernate_demo2

transaction_hibernate_demo1是发起方,transaction_hibernate_demo2是被调用方。

mybatis版本:

transaction_mybatis_demo1 transaction_mybatis_demo2

transaction_mybatis_demo1是发起方,transaction_mybatis_demo2是被调用方。

参考更多免费教程请加入Dubbo技术交流:548209960

Java高并发高可用架构:632103578

基于Dubbo的分布式事务框架(LCN)的更多相关文章

  1. tcc分布式事务框架解析

    前言碎语 楼主之前推荐过2pc的分布式事务框架LCN.今天来详细聊聊TCC事务协议. 2pc实现:https://github.com/codingapi/tx-lcn tcc实现:https://g ...

  2. 终于跑通分布式事务框架tcc-transaction的示例项目

    1.背景 前段时间在看项目代码的时候,发现有些接口的流程比较长,在各个服务里面都有通过数据库事务保证数据的一致性,但是在上游的controller层并没有对一致性做保证. 网上查了下,还没找到基于Go ...

  3. TX-LCN 分布式事务框架

    第十章 TX-LCN 分布式事务框架 (Spring Cloud 高级) 一. 什么是分布式事务 分布式事务是指事务的参与者.支持事务的服务器.资源服务器以及事务管理器分别位 于不同的分布式系统的不同 ...

  4. 分布式事务框架-Litx补偿事务框架源码解析

    前言 之前某段时间在研究分布式事务过程中,对实现原理比较好奇,于是去Gitee上找了几个人气比较高的框架进行学习,其中印象深刻的有Litx,因为Litx源码不多,且都是基于Spring和Dubbo底层 ...

  5. 基于dubbo的分布式项目实例应用

    本文主要学习dubbo服务的启动检查.集群容错.服务均衡.线程模型.直连提供者.只定阅.只注册等知识点,希望通过实例演示进一步理解和掌握这些知识点. 启动检查 Dubbo缺省会在启动消费者时检查依赖的 ...

  6. 基于 dubbo 的分布式架构

    前言 现在越来越多的互联网公司还是将自己公司的项目进行服务化,这确实是今后项目开发的一个趋势,就这个点再凭借之前的 SSM 项目来让第一次接触的同学能快速上手. 浅谈分布式架构 分布式架构单看这个名字 ...

  7. 分布式事务、多数据源、分库分表中间件之spring boot基于Atomikos+XADataSource分布式事务配置(100%纯动态)

    本文描述spring boot基于Atomikos+DruidXADataSource分布式事务配置(100%纯动态),也就是增加.减少数据源只需要修改application.properties文件 ...

  8. 分布式事务框架&解决方案参考

    两种开源解决方案框架介绍: https://blog.csdn.net/zyndev/article/details/79604395#_97 LCN: https://www.jianshu.com ...

  9. Dubbo 支持分布式事务吗?

    目前暂时不支持,可与通过 tcc-transaction 框架实现 介绍:tcc-transaction 是开源的 TCC 补偿性分布式事务框架 Git 地址:https://github.com/c ...

随机推荐

  1. 学习笔记:javascript内置对象:数组对象

    1.数组对象的创建   1.设置一个长度为0的数组  var myarr=new array(); 2.设置一个长度为n的数组  var myarr=new arr(n); 3.声明一个赋值的指定长度 ...

  2. [UWP]实用的Shape指南

    在UWP UI系统中,使用Shape是绘制2D图形最简单的方式,小到图标,大到图表都用到Shape的派生类,可以说有举足轻重的地位.幸运的是从Silverlight以来Shape基本没有什么大改动,简 ...

  3. Chrome DevTools 的 Queueing、Stalled解析

    https://developers.google.com/web/tools/chrome-devtools/network-performance/understanding-resource-t ...

  4. Java学习笔记--链表

    心在山东身在吴,飘蓬江海漫嗟吁. 他时若遂凌云志, 敢笑黄巢不丈夫. --水浒传 先上源代码,LinkedList类: private static class Node<E> { E i ...

  5. Visual Studio Package 插件开发之自动生成实体工具

    前言 这一篇是VS插件基于Visual Studio SDK扩展开发的,可能有些朋友看到[生成实体]心里可能会暗想,T4模板都可以做了.动软不是已经做了么.不就是读库保存文件到指定路径么…… 我希望做 ...

  6. CSS3如何实现超出指定文本以省略号显示效果

    不做前端很久了,今天从重构师那里了解到CSS3已经可以实现很多以往必须通过JS才能实现的效果,如渐变,阴影,自动截断文本展示省略号等等强大效果,而且这些功能日渐成熟,已经大量用于生产环境.H5真的日渐 ...

  7. 【JS中循环嵌套常见的六大经典例题+六大图形题,你知道哪几个?】

    首先,了解一下循环嵌套的特点:外层循环转一次,内层循环转一圈. 在上一篇随笔中详细介绍了JS中的分支结构和循环结构,我们来简单的回顾一下For循环结构: 1.for循环有三个表达式,分别为: ①定义循 ...

  8. HourRank 20

    第一题略 第二题组合数学 s1 = min(cnt['a'],cnt['b']), s2 = min(cnt['c'],cnt['d']), b1 = max(cnt['a'],cnt['b']), ...

  9. javaWeb学习总结(7)- 使用Session防止表单重复提交

    在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没有响应,那么用户可能会以为是自己没有提交表单,就会再点击提交按钮重复提交表单,我们在开发中必须防止表单重复提交. 一.表单重复提 ...

  10. Tomcat 安装与配置

    1. 将压缩文件“apache-tomcat-7.0.62.zip ”上传到linux系统目录:/home/下 2. 进入目录 cd /home/ 解压文件,执行如下命令:unzip apache-t ...