当前位置:网站首页>Talk about the SQL server version of DTM sub transaction barrier function

Talk about the SQL server version of DTM sub transaction barrier function

2022-07-05 03:02:00 Catcher8

background

I wrote two articles on how to use it C# be based on DTM Make it easy SAGA and TCC Of distributed transactions , There is a sub transaction barrier function , Good handling of null compensation 、 Hang 、 Repeated requests and other abnormal problems .

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

But the previous examples are based on mysql Of , It was asked if other databases were supported .

Obviously this is supported , Relational databases , except mysql, And support pgsql and sql server .

Some existing systems , There must be a lot more based on sql server Developed , If this batch of systems want to access DTM, There is no need to move the database first and then access .

So next , Lao Huang will take you through the experience based on sql server Version of DTM Sub transaction barrier function .

The example will be based on the previous SAGA Examples of transformation .

Sub transaction barrier table

Use the sub transaction barrier first , It is essential to prepare a sub transaction barrier table , So this sub transaction barrier table should be placed under the database of that instance ?

All you need to do here is make sure , The business data to be operated and the sub transaction barrier can be in the same local transaction .

The following is for SQL Server Table of SQL.

IF EXISTS (SELECT * FROM sysobjects WHERE id = object_id(N’[dbo].[barrier]’) and OBJECTPROPERTY(id, N’IsUserTable’) = 1)  
BEGIN
  DROP TABLE [dbo].[barrier]
END

GO

CREATE 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())
)

GO

CREATE UNIQUE INDEX[ix_uniq_barrier] ON[dbo].[barrier]
        ([gid] ASC, [branch_id] ASC, [op] ASC, [barrier_id] ASC)
WITH(IGNORE_DUP_KEY = ON)

GO

The key here is the unique index , There is one IGNORE_DUP_KEY = ON. This is actually for equivalence mysql Of insert ignore.

In fact, the preparatory work has already been completed here .

Here is an example after the transformation , Not much to do , Just switch some configurations .

Switch configuration

To be in InApi Which specifies the sub transaction barrier Database type and Custom table name .

Perform the following configuration before startup

//  Appoint   Sub transaction barrier   The database type is  sql server
Dtmcli.DtmImp.DbSpecialDelegate.Instance.SetCurrentDBType("sqlserver");

//  Appoint   Table name of the sub transaction barrier table 
Dtmcli.BranchBarrier.SetBarrierTableName("[test].[dbo].[barrier]");

For the table name , Lao Huang suggested adding the name of the library .

PS: This setting should be put into the configuration file later , At this stage, it is basically to maintain and go The version is written in a similar way .

Last but not least is to change the connection string and 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);
}

Come here , All the transformation has been completed . Let's take a look at the specific example demonstration .

Example demonstration

Here's a demonstration of Talk about how to use it C# Easily complete a SAGA Distributed transactions There are two problems: null compensation and idempotence .

Let's look at the short compensation .

Let's look at idempotent

The log output and behavior effect are basically consistent .

Finally, look at the data in the database

At the end

In this article , Describes how to use in the sub transaction barrier SQL Server As underlying storage . I hope it will be helpful for you to study distributed transactions .

Sample code of this article : DtmMsSqlSample

Reference material

原网站

版权声明
本文为[Catcher8]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/02/202202140825535530.html