From 62fc8bd69c3eac4b64d0d00183ae5fc0e1a2b679 Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@users.noreply.github.com> Date: Tue, 16 Dec 2025 09:54:47 +0800 Subject: [PATCH] =?UTF-8?q?Updated=20=E4=BA=8B=E5=8A=A1=20(markdown)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 事务.md | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/事务.md b/事务.md index 831c8e1..665a108 100644 --- a/事务.md +++ b/事务.md @@ -132,6 +132,40 @@ for update 在 Oracle/PostgreSQL/MySql 是通用的写法,我们对 SqlServer SELECT ... FROM [User] a With(UpdLock, RowLock, NoWait) ``` +## 5. 外部事务 + +```csharp +// 场景:已经有一个开启的 Connection 和 Transaction +using (var conn = new Microsoft.Data.SqlClient.SqlConnection("...")) +{ + conn.Open(); + using (var tran = conn.BeginTransaction()) + { + // 1. 原生/Dapper 操作 + // command.Transaction = tran; + // command.ExecuteNonQuery(); + + // 2. 桥接给 FreeSql + // 使用扩展方法创建适配器,传入现有的 tran + using (var uow = fsql.CreateUnitOfWork(tran)) + { + // 在此 uow 下获取的仓储或 Orm,都会使用传入的 tran + var repo = uow.GetRepository(); + repo.Insert(new MyEntity { Name = "FreeSql Insert" }); + + // 或者直接使用 Orm + uow.Orm.Insert(new MyEntity { Name = "Direct Orm Insert" }).ExecuteAffrows(); + + // 这里的 Commit 只会触发 FreeSql 的事件,不会提交物理事务 + uow.Commit(); + } + + // 3. 真正的提交由最外层控制 + tran.Commit(); + } +} +``` + ## 更多资料 - [《租户》](%e7%a7%9f%e6%88%b7)