聊一聊DTM子事务屏障功能之SQL Server版

2023-11-05 19:38

本文主要是介绍聊一聊DTM子事务屏障功能之SQL Server版,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

背景

前面写了两篇(聊一聊如何用C#轻松完成一个SAGA分布式事务和聊一聊如何用C#轻松完成一个TCC分布式事务)如何用 C# 基于 DTM 轻松实现 SAGA 和 TCC 的分布式事务,其中有一个子事务屏障的功能,很好的处理了空补偿、悬挂、重复请求等异常问题。

https://dtm.pub/practice/barrier.html

不过前面的例子都是基于 mysql 的,有人问是否还支持其他数据库。

很明显这个是支持的,关系型数据库这一块,除了 mysql,还支持 pgsql 和 sql server 。

现存的一些系统,肯定还有不少是基于 sql server 开发的,如果这一批系统想接入 DTM,就不需要先迁库再接入了。

那么接下来,老黄就带大家体验一下基于 sql server 版本的 DTM 子事务屏障功能。

例子会基于前面 SAGA 的例子进行改造。

子事务屏障表

要先使用子事务屏障,必不可少的是要准备一个子事务屏障表,那么这个子事务屏障表要放在那个实例的那个库下面呢?

这里只需要保证,要操作的业务数据和子事务屏障能在同一个本地事务里面即可。

下面是针对 SQL Server 的建表 SQL。

IF EXISTS (SELECT * FROM sysobjects WHERE id = object_id(N’[dbo].[barrier]’) and OBJECTPROPERTY(id, N’IsUserTable’) = 1)  
BEGINDROP TABLE [dbo].[barrier]
ENDGOCREATE TABLE [dbo].[barrier]
([id] bigint NOT NULL IDENTITY(1,1) PRIMARY KEY,[trans_type] varchar(45) NOT NULL DEFAULT(''),[gid] varchar(128) NOT NULL DEFAULT(''),[branch_id] varchar(128) NOT NULL DEFAULT(''),[op] varchar(45) NOT NULL DEFAULT(''),[barrier_id] varchar(45) NOT NULL DEFAULT(''),[reason] varchar(45) NOT NULL DEFAULT(''),[create_time] datetime NOT NULL DEFAULT(getdate()) ,[update_time] datetime NOT NULL DEFAULT(getdate())
)GOCREATE UNIQUE INDEX[ix_uniq_barrier] ON[dbo].[barrier]([gid] ASC, [branch_id] ASC, [op] ASC, [barrier_id] ASC)
WITH(IGNORE_DUP_KEY = ON)GO

这里比较关键的是那个唯一索引,有一个 IGNORE_DUP_KEY = ON。这个其实就是为了等价 mysql 的 insert ignore。

到这里其实准备工作就已经七七八八了。

下面就来改造后例子吧,要做的东西不多,就是切换一些配置。

切换配置

要在 InApi 里面指定子事务屏障的数据库类型自定义的表名

在启动前进行下面的配置

// 指定 子事务屏障 数据库类型为 sql server
Dtmcli.DtmImp.DbSpecialDelegate.Instance.SetCurrentDBType("sqlserver");// 指定 子事务屏障表的表名
Dtmcli.BranchBarrier.SetBarrierTableName("[test].[dbo].[barrier]");

对于表名这一块,老黄是建议把库名也加上的。

PS: 这个设置后续应该会放到配置文件中,现阶段基本是保持和 go 版本类似的写法。

最后不可以少的就是要改一下连接字符串和 SqlConnection 了。

public class Db
{private static readonly string _conn = "Data Source=127.0.0.1, 1433;Initial Catalog=test;user id=dev;password=123456;TrustServerCertificate=True;";public static DbConnection GeConn() => new Microsoft.Data.SqlClient.SqlConnection(_conn);
}

到这里,所有的改造就已经完成了。下面来看具体的例子演示吧。

例子演示

这里演示的是  聊一聊如何用C#轻松完成一个SAGA分布式事务 里面的空补偿和幂等两个问题。

先来看空补偿的

87473061f5227272aa20565221c7bcd4.png

再来看看幂等的

2fe4dec365d16160807467902b083e2f.png


日志输出和行为效果基本都是一致的。

最后看看数据库里面的数据

cad67b3fddbc477aa7960344220f794d.png

写在最后

在这篇文章里,介绍了如何在子事务屏障中使用 SQL Server 作为底层存储。希望对研究分布式事务的您有所帮助。

本文示例代码: 

https://github.com/catcherwong-archive/2022/tree/main/DtmMsSqlSample

参考资料

https://dtm.pub/practice/barrier.html#原理

https://github.com/dtm-labs/dtmcli-csharp

这篇关于聊一聊DTM子事务屏障功能之SQL Server版的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/352047

相关文章

SQL中的外键约束

外键约束用于表示两张表中的指标连接关系。外键约束的作用主要有以下三点: 1.确保子表中的某个字段(外键)只能引用父表中的有效记录2.主表中的列被删除时,子表中的关联列也会被删除3.主表中的列更新时,子表中的关联元素也会被更新 子表中的元素指向主表 以下是一个外键约束的实例展示

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

如何去写一手好SQL

MySQL性能 最大数据量 抛开数据量和并发数,谈性能都是耍流氓。MySQL没有限制单表最大记录数,它取决于操作系统对文件大小的限制。 《阿里巴巴Java开发手册》提出单表行数超过500万行或者单表容量超过2GB,才推荐分库分表。性能由综合因素决定,抛开业务复杂度,影响程度依次是硬件配置、MySQL配置、数据表设计、索引优化。500万这个值仅供参考,并非铁律。 博主曾经操作过超过4亿行数据

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

MySQL数据库宕机,启动不起来,教你一招搞定!

作者介绍:老苏,10余年DBA工作运维经验,擅长Oracle、MySQL、PG、Mongodb数据库运维(如安装迁移,性能优化、故障应急处理等)公众号:老苏畅谈运维欢迎关注本人公众号,更多精彩与您分享。 MySQL数据库宕机,数据页损坏问题,启动不起来,该如何排查和解决,本文将为你说明具体的排查过程。 查看MySQL error日志 查看 MySQL error日志,排查哪个表(表空间

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time

MySQL高性能优化规范

前言:      笔者最近上班途中突然想丰富下自己的数据库优化技能。于是在查阅了多篇文章后,总结出了这篇! 数据库命令规范 所有数据库对象名称必须使用小写字母并用下划线分割 所有数据库对象名称禁止使用mysql保留关键字(如果表名中包含关键字查询时,需要将其用单引号括起来) 数据库对象的命名要能做到见名识意,并且最后不要超过32个字符 临时库表必须以tmp_为前缀并以日期为后缀,备份

[MySQL表的增删改查-进阶]

🌈个人主页:努力学编程’ ⛅个人推荐: c语言从初阶到进阶 JavaEE详解 数据结构 ⚡学好数据结构,刷题刻不容缓:点击一起刷题 🌙心灵鸡汤:总有人要赢,为什么不能是我呢 💻💻💻数据库约束 🔭🔭🔭约束类型 not null: 指示某列不能存储 NULL 值unique: 保证某列的每行必须有唯一的值default: 规定没有给列赋值时的默认值.primary key:

MySQL-CRUD入门1

文章目录 认识配置文件client节点mysql节点mysqld节点 数据的添加(Create)添加一行数据添加多行数据两种添加数据的效率对比 数据的查询(Retrieve)全列查询指定列查询查询中带有表达式关于字面量关于as重命名 临时表引入distinct去重order by 排序关于NULL 认识配置文件 在我们的MySQL服务安装好了之后, 会有一个配置文件, 也就