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