答案:TransactionScope通过环境事务模型简化C#中跨数据库操作的事务管理,需引入System.Transactions命名空间,在.NET Core中需安装System.Transactions.Local包;使用using语句创建作用域,执行操作后调用Complete()提交,否则自动回滚;涉及多连接时会升级为分布式事务,可通过复用连接或配置TransactionOptions避免。

在C#中使用
TransactionScope可以方便地实现跨多个数据库操作的事务管理,确保所有操作要么全部成功,要么全部回滚。它属于.NET Framework中的事务处理机制,基于环境事务(ambient transaction)模型。
需要的引用
命名空间:你不需要额外安装NuGet包(.NET Framework项目中),但需要引入以下命名空间:
using System.Transactions;在 .NET Core 或 .NET 5+ 中,
System.Transactions默认不包含,需通过 NuGet 安装:
- 包名称:System.Transactions.Local
可通过 NuGet 包管理器或命令行添加:
dotnet add package System.Transactions.Local基本使用方法
使用
TransactionScope的典型步骤如下:
- 使用
using
语句创建一个TransactionScope
实例 - 在作用域内执行数据库操作(如多个 SqlCommand 或 Entity Framework 操作)
- 调用
scope.Complete()
表示事务可以提交 - 离开
using
块时,若未调用Complete
,事务自动回滚
示例代码(使用 ADO.NET):
using (var scope = new TransactionScope()){
using (var connection = new SqlConnection(connectionString))
{
connection.Open();
var cmd1 = new SqlCommand("UPDATE Accounts SET Balance -= 100 WHERE Id = 1", connection);
cmd1.ExecuteNonQuery();
var cmd2 = new SqlCommand("UPDATE Accounts SET Balance += 100 WHERE Id = 2", connection);
cmd2.ExecuteNonQuery();
}
// 提交事务
scope.Complete();
}
// 离开 using 块后自动提交或回滚
注意事项和常见配置
事务自动升级:如果涉及多个连接或资源管理器(如两个不同的数据库),
TransactionScope会自动将事务提升为分布式事务,此时需要 MSDTC(Windows)或 .NET Core 下的替代支持(如使用轻量级事务或配置)。
避免分布式事务的方法:
- 复用同一个数据库连接(适用于单数据库)
- 设置
TransactionScopeOption
和TransactionOptions
示例:指定事务超时和隔离级别
var transactionOptions = new TransactionOptions{
IsolationLevel = IsolationLevel.ReadCommitted,
Timeout = TimeSpan.FromMinutes(10)
};
using (var scope = new TransactionScope(TransactionScopeOption.Required, transactionOptions))
{
// 数据库操作...
scope.Complete();
}
Entity Framework 中也适用,只要上下文在
TransactionScope内创建即可。 基本上就这些,正确使用
TransactionScope能大大简化事务管理,但要注意连接管理和潜在的分布式事务开销。










