ShardingSphere RAW JDBC 分布式事务 Narayana XA 代码示例


项目工程在:transaction-2pc-narayana-xa-raw-jdbc-example

代码简介

    基于ShardingSphere的 Narayana XA实现一个简单的分布式事务应用demo

环境配置

    启动两个MySQL5.7的docker镜像,下面命令直接复制运行即可:

# 启动两个mysql
docker run --name mysql11 -p 3311:3306 -e MYSQL_ROOT_PASSWORD=root -e MYSQL_ROOT_HOST=% -d mysql:5.7
docker run --name mysql12 -p 3312:3306 -e MYSQL_ROOT_PASSWORD=root -e MYSQL_ROOT_HOST=% -d mysql:5.7# 在11上创建数据库demo_ds_0,运行下面的SQL语句初始化数据库和表
docker exec -ti mysql11 mysql -u root -pcreate database demo_ds_0;
use demo_ds_0;
CREATE TABLE IF NOT EXISTS t_order_0 (order_id BIGINT NOT NULL, user_id INT NOT NULL, PRIMARY KEY (order_id));
CREATE TABLE IF NOT EXISTS t_order_1 (order_id BIGINT NOT NULL, user_id INT NOT NULL, PRIMARY KEY (order_id));# 在12上创建数据库demo_ds_1,运行下面的SQL语句初始化数据库和表
docker exec -ti mysql12 mysql -u root -pcreate database demo_ds_1;
use demo_ds_1;
CREATE TABLE IF NOT EXISTS t_order_0 (order_id BIGINT NOT NULL, user_id INT NOT NULL, PRIMARY KEY (order_id));
CREATE TABLE IF NOT EXISTS t_order_1 (order_id BIGINT NOT NULL, user_id INT NOT NULL, PRIMARY KEY (order_id));

程序配置

Maven依赖

    核心依赖下面几个:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>demo</artifactId><version>0.0.1-SNAPSHOT</version><name>transaction-2pc-xa-raw-jdbc-example</name><description>Demo project for Spring Boot</description><properties><java.version>1.8</java.version></properties><dependencies><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId> <!-- Use 'netty-all' for 4.0 or above --><version>8.0.14</version></dependency><dependency><groupId>org.apache.shardingsphere</groupId><artifactId>shardingsphere-jdbc-core</artifactId><version>5.0.0-alpha</version></dependency><dependency><groupId>org.apache.shardingsphere</groupId><artifactId>shardingsphere-transaction-xa-core</artifactId><version>5.0.0-alpha</version></dependency><!--    narayana xa config start  --><dependency><groupId>org.apache.shardingsphere</groupId><artifactId>shardingsphere-transaction-xa-narayana</artifactId><version>5.0.0-alpha</version></dependency><dependency><groupId>org.jboss.narayana.jta</groupId><artifactId>jta</artifactId><version>5.9.9.Final</version></dependency><dependency><groupId>org.jboss.narayana.jts</groupId><artifactId>narayana-jts-integration</artifactId><version>5.9.9.Final</version></dependency><dependency><groupId>org.jboss</groupId><artifactId>jboss-transaction-spi</artifactId><version>7.6.0.Final</version></dependency><dependency><groupId>org.jboss.logging</groupId><artifactId>jboss-logging</artifactId><version>3.4.1.Final</version></dependency><!--    narayana xa config  end --><dependency><groupId>com.zaxxer</groupId><artifactId>HikariCP</artifactId><version>2.2.5</version></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>7</source><target>7</target></configuration></plugin></plugins></build></project>

shardingSphere数据库配置文件

    如上面的docker数据库配置,这里设置了两个数据库,各自有两张表

dataSources:ds_0: !!com.zaxxer.hikari.HikariDataSourcedriverClassName: com.mysql.cj.jdbc.DriverjdbcUrl: jdbc:mysql://localhost:3311/demo_ds_0?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=trueusername: rootpassword: rootautoCommit: falseds_1: !!com.zaxxer.hikari.HikariDataSourcedriverClassName: com.mysql.cj.jdbc.DriverjdbcUrl: jdbc:mysql://localhost:3312/demo_ds_1?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=trueusername: rootpassword: rootautoCommit: falserules:
- !SHARDINGtables:t_order:actualDataNodes: ds_${0..1}.t_order_${0..1}databaseStrategy:standard:shardingColumn: user_idshardingAlgorithmName: database_inlinetableStrategy:standard:shardingColumn: order_idshardingAlgorithmName: t_order_inlinebindingTables:- t_ordershardingAlgorithms:database_inline:type: INLINEprops:algorithm-expression: ds_${user_id % 2}t_order_inline:type: INLINEprops:algorithm-expression: t_order_${order_id % 2}props:sql-show: true

主程序

    暴力直接的原生测试,代码如下:

package com.example.demo;import org.apache.shardingsphere.driver.api.yaml.YamlShardingSphereDataSourceFactory;
import org.apache.shardingsphere.transaction.core.TransactionType;
import org.apache.shardingsphere.transaction.core.TransactionTypeHolder;import javax.sql.DataSource;
import java.io.File;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;public class Transaction2pcXaRawJdbcExampleApplication {/*** 第一次插入数据正常运行成功* 第二次插入数据由于主键冲突,导致回滚*/public static void main(String[] args) throws IOException, SQLException {DataSource dataSource = getShardingDatasource();cleanupData(dataSource);TransactionTypeHolder.set(TransactionType.XA);Connection conn = dataSource.getConnection();String sql = "insert into t_order (user_id, order_id) VALUES (?, ?);";System.out.println("First XA Start insert data");try (PreparedStatement statement = conn.prepareStatement(sql)) {conn.setAutoCommit(false);for (int i = 1; i < 11; i++) {statement.setLong(1, i);statement.setLong(2, i);statement.executeUpdate();}conn.commit();}System.out.println("First XA insert successful");// 设置id+5,如果设置XA事务成功,则所有的数据都不会插入// 设置id+5,如果设置XA事务不成功,则id大于10的数据就会插入到数据库// 程序运行完毕后,查看数据库,没有id大于10的数据,所以XA设置成功System.out.println("Second XA Start insert data");try (PreparedStatement statement = conn.prepareStatement(sql)) {conn.setAutoCommit(false);for (int i = 1; i < 11; i++) {statement.setLong(1, i+5);statement.setLong(2, i+5);statement.executeUpdate();}conn.commit();} catch (Exception e) {System.out.println("Second XA insert failed");conn.rollback();} finally {conn.close();}System.out.println("Second XA insert successful");}private static void cleanupData(DataSource dataSource) {System.out.println("Delete all Data");try (Connection conn = dataSource.getConnection(); Statement statement = conn.createStatement()) {statement.execute("delete from t_order;");conn.commit();} catch (SQLException e) {e.printStackTrace();}System.out.println("Delete all Data successful");}/*** 生成DataSource,文件路径自行替换* @return* @throws IOException* @throws SQLException*/static private DataSource getShardingDatasource() throws IOException, SQLException {String fileName = "F:\\Code\\Java\\JAVA-000\\homework\\shardingSphere-jdbc-example\\transaction-example\\transaction-2pc-xa-raw-jdbc-example\\src\\main\\resources\\sharding-databases-tables.yaml";File yamlFile = new File(fileName);return YamlShardingSphereDataSourceFactory.createDataSource(yamlFile);}}

ShardingSphere RAW JDBC 分布式事务 Narayana XA 代码示例相关推荐

  1. ShardingSphere RAW JDBC 分布式事务XA 代码示例

    ShardingSphere RAW JDBC 分布式事务XA 代码示例 项目工程在:transaction-2pc-xa-raw-jdbc-example 代码简介     基于ShardingSp ...

  2. 通过代码理解分布式事务:XA模式

    什么是XA? 看百科:XA协议由Tuxedo首先提出的,并交给X/Open组织,作为资源管理器(数据库)与事务管理器的接口标准.Oracle.Informix.DB2和Sybase等各大数据库厂家都提 ...

  3. MySQL分布式事务(XA事务)

    MySQL分布式事务(XA事务) 官网:https://dev.mysql.com/doc/refman/5.7/en/xa.html 1.什么是分布式事务 分布式事务就是指事务的参与者.支持事务的服 ...

  4. ShardingSphere Raw JDBC 主从示例

    ShardingSphere Raw JDBC 主从示例 总览     这个示例不结合ORM之类的,直接执行SQL语句.通过写两个简单的文件就可以了,大致的步骤如下: 1.配置Maven依赖 2.配置 ...

  5. 分布式事务之XA协议

    分布式事务之XA协议 业务场景 首先先来看一个物业缴费的业务场景,用户收到缴费单之后进行缴费,分为三步,第一步扣减用户余额,第二步修改订单状态未已缴费,第三步增加物业管理金额.现在我们假设用户余额,订 ...

  6. 分布式事务模型--XA Specification

    本文来说下分布式事务模式–XA Specification 文章目录 概述 XA Specification 预备阶段 提交/回滚阶段 特点剖析 本文小结 概述 事务是一组不可分组的操作集合,这些操作 ...

  7. Apache ShardingSphere 如何实现分布式事务

    陆敬尚 Apache ShardingSphere Committer,SphereEx 基础设施研发工程师,热爱开源,热爱数据库技术,目前专注于 Apache ShardingSphere 事务模块 ...

  8. 分布式事务解决方案和代码落地

    在学习Spring cloud alibaba Seata之前,我们先来了解一下分布式事务的常用解决方案和代码实现,看完出去面试再遇到分布式事务的问题,战无不胜.文章包括了2PC,3PC刚性事务:TC ...

  9. 【SpringBoot2.0】基于Atomikos的多数据源分布式事务(XA)解决方案

    最近工作中在同一项目中用到了多数据源,虽然项目本身对多数据源的事务没有要求,甚至可以不使用事务.但是本着精益求精的原则,加上各种资料的查阅,终于实现了多数据源的XA(分布式事务) 项目框架 sprin ...

最新文章

  1. 黄淮学院计算机录取线,黄淮学院录取投档线
  2. shell 登录mysql 然后quit_使用工具Xshell实现在linux上登录mysql和退出mysql的相关操作讲解...
  3. ImportError: No module named protobuf
  4. 我为什么对TypeScript由黑转粉?
  5. 复制表、复制表结构、复制数据
  6. 构建iOS风格移动Web应用程序的8款开发框架
  7. Google的Guava开发库快速快速入门
  8. visio转换html,【转】5款替代微软Visio的开源免费软件
  9. 基于SSM的宠物领养网站
  10. 微信小程序获取用户手机号
  11. 转帖:在北京5年艰辛快乐的创业经历
  12. 未来20年内,无人驾驶将颠覆这33大行业
  13. 芒果改进YOLOv7系列:超越ConvNeXt结构,原创结合Conv2Former改进结构,Transformer 风格的卷积网络视觉基线模型,高效涨点
  14. 大神教玩转手机摄影+后期
  15. AHB2APB桥接器设计(2)——同步桥设计的介绍
  16. UE4 场景展示Demo
  17. python入门之字符串_03
  18. 论文笔记《Fully Convolutional Networks for Semantic Segmentation》
  19. 去年华为晋身非洲智能手机市场前三,非洲之王受威胁
  20. 错误NDK is missing a “platforms“ directory.

热门文章

  1. HDU 3861 The King’s Problem 强连通分量 最小路径覆盖
  2. cPanel设置自定义404错误页
  3. UESTC 914 方老师的分身I Dijkstra
  4. 打开一个页面,并监听该页面的关闭事件
  5. HDOJ 1286 HDU 1286 找新朋友 ACM 1286 IN HDU
  6. spring-boot 使用 main函数 无法启动的问题完美 解决方案。
  7. 微信小程序背景音乐官方实例代码无效问题解决及音乐src获取方法
  8. angular5使用httpclient时解决跨域问题
  9. 【报告分享】2022中国职业教育行业报告-多鲸资本.pdf(附下载链接)
  10. 再品Resnet残差网络