This is the README file for NTcc-TransactionCore, .NET Core port of Java tcc-transaction. It supports .NET Core/netstandard 2.0 and later, not supported for .NET Framework.
NTcc-TransactionCore is an opensource project aimed at creating a free-for-commercial use TCC transaction, with enterprise features.
NTcc-TransactionCore can be installed in your project with the following command.
PM> Install-Package NTccTransactionCore
PM> Install-Package NTccTransactionCore.Aop
NTcc-TransactionCore Currently supports Oracle, SqlServer as transaction log storage, following packages are available to install:
PM> Install-Package NTccTransactionCore.Oracle
PM> Install-Package NTccTransactionCore.SqlServer
First, you need to configure NTcc-TransactionCore in your Startup.cs
:
public ILifetimeScope AutofacContainer { get; private set; }
public IServiceCollection Services { get; private set; }
public void ConfigureServices(IServiceCollection services)
{
//......
services.AddNTccTransaction((option) =>
{
option.UseOracle((oracleOption) =>
{
oracleOption.ConnectionString = Configuration.GetConnectionString("Your ConnectionStrings");// configure db connectiong
});
option.UseCastleInterceptor(); // use Castle Interceptor
});
Services = services;
}
public void ConfigureContainer(ContainerBuilder containerBuilder)
{
containerBuilder.Register(Services); // register Castle Interceptor
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
this.AutofacContainer = app.ApplicationServices.GetAutofacRoot();
}
Currently supports Oracle, SqlServer as transaction log storage, execute the following database script to create transaction table:
CREATE TABLE NTCC_TRANSACTION
(
TRANSACTION_ID VARCHAR2(128) NOT NULL
, GLOBAL_TRANSACTION_ID VARCHAR2(128)
, BRANCH_QUALIFIER VARCHAR2(128)
, STATUS NUMBER(9, 0) NOT NULL
, TRANSACTION_TYPE NUMBER(9, 0) NOT NULL
, RETRIED_COUNT NUMBER(9, 0) NOT NULL
, CREATE_UTC_TIME DATE NOT NULL
, LAST_UPDATE_UTC_TIME DATE NOT NULL
, VERSION NUMBER(9, 0) NOT NULL
, CONTENT CLOB
, CONSTRAINT PK_NTCC_TRANSACTION PRIMARY KEY
(
TRANSACTION_ID
)
);
CREATE TABLE [dbo].[NTCC_TRANSACTION]
(
[TRANSACTION_ID] varchar(128) NOT NULL
,[GLOBAL_TRANSACTION_ID] varchar(128) NULL
,[BRANCH_QUALIFIER] varchar(128) NULL
,[STATUS] int NOT NULL
,[TRANSACTION_TYPE] int NOT NULL
,[RETRIED_COUNT] int NOT NULL
,[CREATE_UTC_TIME] datetime NOT NULL
,[LAST_UPDATE_UTC_TIME] datetime NOT NULL
,[VERSION] int NOT NULL
,[CONTENT] nvarchar(MAX) NULL
,PRIMARY KEY
(
[TRANSACTION_ID]
)
)
In your business service, you need implement INTccTransactionService
:
public class OrderService : IOrderService, INTccTransactionService
{
private readonly ILogger<OrderService> _logger;
private readonly ICapitalProxy _capitalProxy;
public OrderService(ILogger<OrderService> logger, ICapitalProxy capitalProxy)
{
_logger = logger;
_capitalProxy = capitalProxy;
}
[Compensable(CancelMethod = "CancelOrder", ConfirmMethod = "ConfirmOrder")]
public async Task<string> TryPostOrder(string input, TransactionContext transactionContext = null)
{
return await Task.FromResult("");
}
public async Task ConfirmOrder(string input, TransactionContext transactionContext = null)
{
await Task.CompletedTask;
}
public async Task CancelOrder(string input, TransactionContext transactionContext = null)
{
await Task.CompletedTask;
}
}
And add the attribute [Compensable(CancelMethod = "xxx", ConfirmMethod = "xxx")]
on the Try
method:
[Compensable(CancelMethod = "CancelOrder", ConfirmMethod = "ConfirmOrder")]
public async Task<string> TryPostOrder(string input, TransactionContext transactionContext = null)
{
return await Task.FromResult("");
}
The type of the last parameter of the Try
method must be TransactionContext
, it's used to propagate transactions, and you need add Confirm
method and Cancel
method in the business logic service,the parameters of the two methods must be same as Try
method.
public async Task ConfirmOrder(string input, TransactionContext transactionContext = null)
{
await Task.CompletedTask;
}
public async Task CancelOrder(string input, TransactionContext transactionContext = null)
{
await Task.CompletedTask;
}
Then register your class that implement INTccTransactionService
in Startup.cs
:
public void ConfigureServices(IServiceCollection services)
{
services.AddTransient<IOrderService, OrderService>();
services.AddTransient<OrderService>();
}
One of the easiest ways to contribute is to participate in discussions and discuss issues. You can also contribute by submitting pull requests with code changes.