{"id":19073346,"url":"https://github.com/dtm-labs/client-csharp","last_synced_at":"2025-05-15T20:00:36.430Z","repository":{"id":37960250,"uuid":"390383983","full_name":"dtm-labs/client-csharp","owner":"dtm-labs","description":"The new client for dtm in csharp, including workflow, dtmcli, and dtmgrpc","archived":false,"fork":false,"pushed_at":"2025-04-25T01:29:41.000Z","size":279,"stargazers_count":123,"open_issues_count":5,"forks_count":27,"subscribers_count":7,"default_branch":"main","last_synced_at":"2025-04-25T01:53:15.154Z","etag":null,"topics":["csharp","database","distributed","distributed-transactions","microservice","saga","tcc","transaction"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/dtm-labs.png","metadata":{"files":{"readme":"README-cn.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-07-28T14:36:47.000Z","updated_at":"2025-04-25T01:29:45.000Z","dependencies_parsed_at":"2025-03-10T22:45:33.988Z","dependency_job_id":"61c58bc6-b7f5-48ec-b936-1795cbaab27b","html_url":"https://github.com/dtm-labs/client-csharp","commit_stats":{"total_commits":74,"total_committers":7,"mean_commits":"10.571428571428571","dds":"0.32432432432432434","last_synced_commit":"5127441799e4bb7887bc1f070bc207d0af6c81d7"},"previous_names":[],"tags_count":10,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dtm-labs%2Fclient-csharp","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dtm-labs%2Fclient-csharp/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dtm-labs%2Fclient-csharp/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dtm-labs%2Fclient-csharp/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dtm-labs","download_url":"https://codeload.github.com/dtm-labs/client-csharp/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254414454,"owners_count":22067261,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["csharp","database","distributed","distributed-transactions","microservice","saga","tcc","transaction"],"created_at":"2024-11-09T01:46:24.936Z","updated_at":"2025-05-15T20:00:35.911Z","avatar_url":"https://github.com/dtm-labs.png","language":"C#","funding_links":[],"categories":["C\\#"],"sub_categories":[],"readme":"[English](./README.md) | 简体中文\n\n# DTM 的 C#客户端\n\n`client-csharp` 是分布式事务管理器 DTM 的 C# 客户端。\n\n| 客户端      |  特性 | nuget |\n| :-----:     | :----:    | :----: |\n| dtmcli      | saga/tcc/2-phase message  | ![](https://img.shields.io/nuget/v/Dtmcli.svg)  ![](https://img.shields.io/nuget/vpre/Dtmcli.svg) ![](https://img.shields.io/nuget/dt/Dtmcli)   |\n| dtmgrpc     | saga/tcc/2-phase message  | ![](https://img.shields.io/nuget/v/Dtmgrpc.svg)  ![](https://img.shields.io/nuget/vpre/Dtmgrpc.svg) ![](https://img.shields.io/nuget/dt/Dtmgrpc)  |\n| workflow    | - | -  |\n\n\n![Build_And_UnitTest](https://github.com/dtm-labs/client-csharp/actions/workflows/build.yml/badge.svg) [![codecov](https://codecov.io/gh/dtm-labs/client-csharp/branch/main/graph/badge.svg?token=Y2BOSQ5QKO)](https://codecov.io/gh/dtm-labs/client-csharp) ![](https://img.shields.io/github/license/dtm-labs/dtmcli-csharp)\n\n\n## dtm分布式事务管理服务\n\nDTM是一款变革性的分布式事务框架，提供了傻瓜式的使用方式，极大的降低了分布式事务的使用门槛，改变了“能不用分布式事务就不用”的行业现状。 dtm 的应用范围非常广，可以应用于以下常见的领域：\n- [非单体的订单系统，大幅简化架构](https://dtm.pub/app/order.html)\n- [秒杀系统，做到在Redis中精准扣库存](https://dtm.pub/app/flash.html)\n- [保证缓存与DB的一致性](https://dtm.pub/app/cache.html)\n- 微服务架构中跨服务更新数据保证一致性\n\n他优雅的解决了幂等、空补偿、悬挂等分布式事务难题，提供跨语言，跨存储引擎组合事务的强大功能：\n\n\u003cimg src=\"https://pica.zhimg.com/80/v2-2f66cb3074e68d38c29694318680acac_1440w.png\" height=250 /\u003e\n\n## 亮点\n\n* 极易接入\n  - 支持HTTP，提供非常简单的接口，极大降低上手分布式事务的难度，新手也能快速接入\n* 使用简单\n  - 开发者不再担心悬挂、空补偿、幂等各类问题，框架层代为处理\n* 跨语言\n  - 可适合多语言栈的公司使用。方便go、python、php、nodejs、ruby、c# 各类语言使用。\n* 易部署、易扩展\n  - 仅依赖mysql，部署简单，易集群化，易水平扩展\n* 多种分布式事务协议支持\n  - TCC、SAGA、XA、事务消息\n\n## 与其他框架对比\n\n目前开源的分布式事务框架，暂未看到非Java语言有成熟的框架。而Java语言的较多，有阿里的SEATA、华为的ServiceComb-Pack，京东的shardingsphere，以及himly，tcc-transaction，ByteTCC等等，其中以seata应用最为广泛。\n\n下面是dtm和seata的主要特性对比：\n\n|  特性| DTM | SEATA |备注|\n|:-----:|:----:|:----:|:----:|\n| 支持语言 |\u003cspan style=\"color:green\"\u003eGolang, C#, Java, Python, PHP及其他\u003c/span\u003e|\u003cspan style=\"color:orange\"\u003eJava\u003c/span\u003e|dtm可轻松接入一门新语言|\n|异常处理| \u003cspan style=\"color:green\"\u003e[子事务屏障自动处理](https://zhuanlan.zhihu.com/p/388444465)\u003c/span\u003e|\u003cspan style=\"color:orange\"\u003e手动处理\u003c/span\u003e |dtm解决了幂等、悬挂、空补偿|\n| TCC事务| \u003cspan style=\"color:green\"\u003e✓\u003c/span\u003e|\u003cspan style=\"color:green\"\u003e✓\u003c/span\u003e||\n| XA事务|\u003cspan style=\"color:green\"\u003e✓\u003c/span\u003e|\u003cspan style=\"color:green\"\u003e✓\u003c/span\u003e||\n|AT事务|\u003cspan style=\"color:red\"\u003e✗\u003c/span\u003e|\u003cspan style=\"color:green\"\u003e✓\u003c/span\u003e|AT与XA类似，性能更好，但有脏回滚|\n| SAGA事务 |\u003cspan style=\"color:orange\"\u003e简单模式\u003c/span\u003e |\u003cspan style=\"color:green\"\u003e状态机复杂模式\u003c/span\u003e |dtm的状态机模式在规划中|\n|事务消息|\u003cspan style=\"color:green\"\u003e✓\u003c/span\u003e|\u003cspan style=\"color:red\"\u003e✗\u003c/span\u003e|dtm提供类似rocketmq的事务消息|\n|通信协议|HTTP|dubbo等协议，无HTTP|dtm后续将支持grpc类协议|\n|star数量|\u003cimg src=\"https://img.shields.io/github/stars/yedf/dtm.svg?style=social\" alt=\"github stars\"/\u003e|\u003cimg src=\"https://img.shields.io/github/stars/seata/seata.svg?style=social\" alt=\"github stars\"/\u003e|dtm从20210604发布0.1，发展快|\n\n从上面对比的特性来看，如果您的语言栈包含了Java之外的语言，那么dtm是您的首选。如果您的语言栈是Java，您也可以选择接入dtm，使用子事务屏障技术，简化您的业务编写。\n\n\n## 安装\n\n通过下面的命令安装 nuget 包\n\n```sh\ndotnet add package Dtmcli\n```\n\n## 配置\n\n这里有两种方式进行配置\n\n1. 使用 setup action\n\n```cs\nservices.AddDtmcli(x =\u003e\n{\n    // DTM server 的 HTTP 地址\n    x.DtmUrl = \"http://localhost:36789\";\n    \n    // 请求 DTM server 的超时时间, 单位是毫秒\n    x.DtmTimeout = 10000; \n    \n    // 请求分支事务的超时时间, 单位是毫秒\n    x.BranchTimeout = 10000;\n    \n    // 子事务屏障的数据库类型, mysql, postgres, sqlserver\n    x.SqlDbType = \"mysql\";\n\n    // 子事务屏障的数据表名\n    x.BarrierTableName = \"dtm_barrier.barrier\";\n});\n```\n\n2. 使用  `IConfiguration`\n\n```cs\nservices.AddDtmcli(Configuration, \"dtm\");\n```\n\n添加配置文件，以 JSON 为例：\n\n```JSON\n{\n  \"dtm\": {\n    \"DtmUrl\": \"http://localhost:36789\",\n    \"DtmTimeout\": 10000,\n    \"BranchTimeout\": 10000,\n    \"SqlDbType\": \"mysql\",\n    \"BarrierTableName\": \"dtm_barrier.barrier\",\n  }\n}\n```\n\n## 用法\n\n### SAGA\n\n```cs\npublic class MyBusi\n{ \n    private readonly Dtmcli.IDtmTransFactory _transFactory;\n\n    public MyBusi(Dtmcli.IDtmTransFactory transFactory)\n    {\n        this._transFactory = transFactory;\n    }\n\n    public async Task DoBusAsync()\n    {\n        var gid = Guid.NewGuid().ToString();\n        var req = new BusiReq {  Amount = 30 };\n        \n        // NOTE: After DTM v1.12.2\n        // when svc start with http or https, DTM server will send HTTP request to svc\n        // when svc don't start with http or https,  DTM server will send gRPC request to svc\n        var svc = \"http://localhost:5005\";\n\n        var saga = _transFactory.NewSaga(gid);\n        // 添加子事务操作\n        saga.Add(\n            // 正向操作 URL\n            svc + \"/api/TransOut\",\n            \n            // 逆向操作 URL\n            svc + \"/api/TransOutCompensate\",\n\n            // 参数\n            req);\n        saga.Add(\n            svc + \"/api/TransIn\",\n            svc + \"/api/TransInCompensate\",\n            req);\n\n        await saga.Submit();\n    }\n}\n```\n\n### TCC pattern\n\n```cs\npublic class MyBusi\n{ \n    private readonly Dtmcli.TccGlobalTransaction _globalTransaction;\n\n    public MyBusi(Dtmcli.TccGlobalTransaction globalTransaction)\n    {\n        this._globalTransaction = globalTransaction;\n    }\n\n    public async Task DoBusAsync()\n    {\n        var gid = Guid.NewGuid().ToString();\n        var req = new BusiReq {  Amount = 30 };\n        var svc = \"http://localhost:5005\";\n\n        await _globalTransaction.Excecute(gid, async tcc =\u003e\n        {\n            // 调用 TCC 子事务\n            await tcc.CallBranch(\n                // 参数\n                req,\n\n                // Try 阶段的 URL\n                svc + \"/api/TransOutTry\",\n\n                // Confirm 阶段的 URL \n                svc + \"/api/TransOutConfirm\",\n\n                // Cancel 阶段的 URL\n                svc + \"/api/TransOutCancel\");\n\n            await tcc.CallBranch(\n                req,\n                svc + \"/api/TransInTry\",\n                svc + \"/api/TransInConfirm\",\n                svc + \"/api/TransInCancel\");\n        });\n    }\n}\n```\n\n### 二阶段消息\n\n```cs\npublic class MyBusi\n{ \n    private readonly Dtmcli.IDtmTransFactory _transFactory;\n\n    public MyBusi(Dtmcli.IDtmTransFactory transFactory)\n    {\n        this._transFactory = transFactory;\n    }\n\n    public async Task DoBusAsync()\n    {\n        var gid = Guid.NewGuid().ToString();\n        var req = new BusiReq {  Amount = 30 };\n        var svc = \"http://localhost:5005\";\n\n        var msg = _transFactory.NewMsg(gid);\n        // 添加子事务操作\n        msg.Add(\n            // 操作的 URL\n            svc + \"/api/TransOut\",\n\n            // 参数\n            req);\n        msg.Add(\n            svc + \"/api/TransIn\",\n            req);\n\n        // 用法 1:\n        // 发送 prepare 消息\n        await msg.Prepare(svc + \"/api/QueryPrepared\");\n        // 发送 submit 消息\n        await msg.Submit();\n\n        // 用法 2:\n        using (var conn = GetDbConnection())\n        {\n            await msg.DoAndSubmitDB(svc + \"/api/QueryPrepared\", conn, async tx =\u003e \n            {\n                await conn.ExecuteAsync(\"insert ....\", new { }, tx);\n                await conn.ExecuteAsync(\"update ....\", new { }, tx);\n                await conn.ExecuteAsync(\"delete ....\", new { }, tx);\n            });\n        }\n    }\n}\n```\n\n### XA pattern\n\n```cs\npublic class MyBusi\n{ \n    private readonly Dtmcli.XaGlobalTransaction _globalTransaction;\n\n    public MyBusi(Dtmcli.XaGlobalTransaction globalTransaction)\n    {\n        this._globalTransaction = globalTransaction;\n    }\n\n    public async Task DoBusAsync(CancellationToken cancellationToken)\n    {\n        var svc = \"http://localhost:5005\";\n\n        await _globalTransaction.ExcecuteAsync(async (Xa xa) =\u003e\n        {\n            // NOTE: XA 模式的限制\n            // 当前模式仅支持mysql、postgresDB，请修改相应的客户端配置，如SqlDbType等。\n            // 如使用Mysql并且版本低于8.0需关闭连接池使用\n\n            // 调用 XA 子事务\n            await xa.CallBranch(\n                // 参数\n                new TransRequest(\"1\", -30), \n\n                // 操作的 URL\n                svc + \"/XaTransOut\",\n\n                // 取消令牌\n                cancellationToken);\n            \n            await xa.CallBranch(\n                new TransRequest(\"2\", 30), \n                svc + \"/XaTransIn\", \n                cancellationToken);\n\n        }, cancellationToken);\n    }\n}\n```\n\n## 可运行的使用示例\n\n见 ~~[https://github.com/dtm-labs/dtmcli-csharp-sample](https://github.com/dtm-labs/dtmcli-csharp-sample)~~ [client-csharp/samples · dtm-labs/client-csharp](https://github.com/dtm-labs/client-csharp/tree/main/samples)\n\n## 联系我们\n### 公众号\ndtm官方公众号：分布式事务，大量干货分享，以及dtm的最新消息\n### 交流群\n请加 yedf2008 好友或者扫码加好友，验证回复 csharp 按照指引进群\n\n![yedf2008](http://service.ivydad.com/cover/dubbingb6b5e2c0-2d2a-cd59-f7c5-c6b90aceb6f1.jpeg)\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdtm-labs%2Fclient-csharp","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdtm-labs%2Fclient-csharp","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdtm-labs%2Fclient-csharp/lists"}