前言
FreeSql 支持
MySql/SqlServer/PostgreSQL/Oracle/Sqlite/Firebird/达梦/Gbase/神通/人大金仓/翰高/Clickhouse/MsAccess Ado.net 数据库,以及 Odbc 的专门实现包。
FreeSql.Cloud 为 FreeSql 提供跨数据库访问,分布式事务TCC、SAGA解决方案,支持 .NET Core 2.1+, .NET Framework 4.0+.
本文主要讲解从跨数据库访问,到分布式事务落地,再升级到微服务服务编排探讨。写下本文更多的成份是带有疑问号,希望有微服务落地经验的朋友指教一下。
TCC 事务特点:
- Try 用于资源冻结/预扣;
- Try 全部环节通过,代表业务一定能完成,进入 Confirm 环节;
- Try 任何环节失败,代表业务失败,进入 Cancel 环节;
- Confirm 失败会进行重试N次,直到交付成功,或者人工干预;
- Cancel 失败会进行重试N次,直到取消成功,或者人工干预;
SAGA 事务特点:
- Commit 用于业务提交;
- Commit 全部环节通过,代表业务交付成功;
- Commit 任何环节失败,代表业务失败,进入 Cancel 环节;
- Cancel 失败会进行重试N次,直到取消成功,或者人工干预;
由于 TCC/Saga 两种流程有相似之处,因此本文主要以 Saga 为例讲解应用代码。本文讲解的落地场景如下:
第一步:去 数据库db1 扣除 user.Point - 10
第二步:去 数据库db2 扣除 goods.Stock - 1
第三步:去 数据库db3 创建订单
第二步库存不足时,整个流程怎么执行?
⚡ 快速开始
dotnet add package FreeSql.Cloud
or
Install-Package FreeSql.Cloud
public enum DbEnum { db1, db2, db3 }var fsql = new FreeSqlCloud<DbEnum>("app001"); //提示:泛型可以传入 stringfsql.DistributeTrace = log => Console.WriteLine(log.Split('\n')[0].Trim());fsql.Register(DbEnum.db1, () => new FreeSqlBuilder() .UseConnectionString(DataType.SqlServer, @"Data Source=...") .Build());fsql.Register(DbEnum.db2, () => new FreeSqlBuilder() .UseConnectionString(DataType.MySql, @"Data Source=...") .Build());fsql.Register(DbEnum.db3, () => new FreeSqlBuilder() .UseConnectionString