C#中如何使用事务范围(TransactionScope)?需要什么引用?

来源:这里教程网 时间:2026-02-21 17:26:10 作者:

在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
能大大简化事务管理,但要注意连接管理和潜在的分布式事务开销。

相关推荐