【C#】简单聊下Framework框架下的事务

框架用的多了,之前版本的事务都忘记了。本次简单聊下.net framework 4.8框架下本身的事务

1、SqlClient

在 C# 中,使用 using 块可以方便地实现对资源的自动释放,但它不适用于实现事务处理。为了在 C# 中实现事务,在关系型数据库中,你可以使用 ADO.NET 类库中的事务机制。

例如,如果你正在使用 SQL Server 数据库,可以使用 SqlTransaction 类来执行事务操作。以下是一个示例,演示如何在 C# 中使用 SqlTransaction 类来执行事务:

using System.Data.SqlClient;

public class Program
{
    
    
    public static void Main()
    {
    
    
        string connectionString = "your_connection_string";

        using (SqlConnection connection = new SqlConnection(connectionString))
        {
    
    
            connection.Open();

            // 开始事务
            SqlTransaction transaction = connection.BeginTransaction();

            try
            {
    
    
                // 执行数据库操作
                using (SqlCommand command = connection.CreateCommand())
                {
    
    
                    command.Transaction = transaction;

                    command.CommandText = "INSERT INTO YourTable (Column1, Column2) VALUES (@Value1, @Value2)";
                    command.Parameters.AddWithValue("@Value1", "Value 1");
                    command.Parameters.AddWithValue("@Value2", "Value 2");

                    command.ExecuteNonQuery();
                }

                // 提交事务
                transaction.Commit();
            }
            catch (Exception ex)
            {
    
    
                // 回滚事务
                transaction.Rollback();

                Console.WriteLine("Transaction failed: " + ex.Message);
            }
        }
    }
}

在上面的示例中,我们使用 SqlConnection 来创建一个数据库连接,并通过 BeginTransaction 方法创建一个事务。然后,我们可以在事务中执行数据库操作,如果操作成功,可以调用 Commit 方法提交事务;如果操作发生异常,可以调用 Rollback 方法回滚事务。

请注意,上述示例仅用于演示事务处理的基本概念,实际数据库和操作的情况可能有所不同。你需要根据自己的数据库类型和操作进行相应的调整。

2、TransactionScope

在 C# 中,在操作数据库时,使用 using 语句块来创建事务是不可行的,因为 using 语句块会自动处理资源的释放,而事务需要在事务完成之前持续存在。

为了实现独立的事务作用域,你可以使用 TransactionScope 类来管理事务。TransactionScope 类提供了一种简单的方式来处理事务,它在代码块内自动处理事务的提交或回滚,做到了事务的嵌套和分布式事务的支持。

以下是一个示例,演示如何在 C# 中使用 TransactionScope 来实现独立的事务处理:

using System;
using System.Data.SqlClient;
using System.Transactions;

public class Program
{
    
    
    public static void Main()
    {
    
    
        string connectionString = "your_connection_string";

        using (TransactionScope scope = new TransactionScope())
        {
    
    
            try
            {
    
    
                using (SqlConnection connection1 = new SqlConnection(connectionString))
                {
    
    
                    connection1.Open();

                    // 在第一个连接上执行数据库操作
                    using (SqlCommand command1 = connection1.CreateCommand())
                    {
    
    
                        command1.CommandText = "INSERT INTO Table1 (Column1, Column2) VALUES (@Value1, @Value2)";
                        command1.Parameters.AddWithValue("@Value1", "Value 1");
                        command1.Parameters.AddWithValue("@Value2", "Value 2");

                        command1.ExecuteNonQuery();
                    }
                }

                using (SqlConnection connection2 = new SqlConnection(connectionString))
                {
    
    
                    connection2.Open();

                    // 在第二个连接上执行数据库操作
                    using (SqlCommand command2 = connection2.CreateCommand())
                    {
    
    
                        command2.CommandText = "INSERT INTO Table2 (Column1, Column2) VALUES (@Value1, @Value2)";
                        command2.Parameters.AddWithValue("@Value1", "Value 1");
                        command2.Parameters.AddWithValue("@Value2", "Value 2");

                        command2.ExecuteNonQuery();
                    }
                }

                // 提交事务
                scope.Complete();
            }
            catch (Exception ex)
            {
    
    
                // 回滚事务
                Console.WriteLine("Transaction failed: " + ex.Message);
            }
        }
    }
}

在上面的示例中,我们使用 TransactionScope 类创建了一个独立的事务作用域。在事务作用域内部,我们可以在多个连接上执行数据库操作,当所有操作都成功完成时,调用 Complete 方法来提交整个事务;如果任何操作失败,则事务会自动回滚。

请注意,为了使用 TransactionScope 类,你需要在代码文件的顶部添加对 System.Transactions 命名空间的引用,并确保所使用的数据库驱动程序和数据库支持 System.Transactions 命名空间。此外,将 TransactionScope 与分布式事务一起使用时,还需要配置相关的分布式事务管理器。

3、引用

在 .NET Framework 4.8 中,System.Transactions 命名空间是可用的,并且不需要通过 NuGet 包进行下载和安装。它是 .NET Framework 的一部分,以支持事务处理。

如果你在 .NET Framework 4.8 的项目中无法使用 System.Transactions,请确保你的项目引用了正确的 .NET Framework 版本。你可以在 Visual Studio 中检查项目属性,确认项目的目标框架版本为 .NET Framework 4.8。

如果你的项目已经正确引用了 .NET Framework 4.8,并且仍然无法使用 System.Transactions,可能有以下几种可能的原因:

1)缺少对 System.Transactions 的引用:请确保你的代码文件中包含了 using System.Transactions; 的引用语句。

2)其他命名冲突:如果你有其他命名空间或类型与 System.Transactions 冲突,可能会导致无法使用它。请检查你的代码,并确保没有命名冲突的情况发生。

3)缺少相关的程序集:确保你的项目引用了 System.Transactions 相关的程序集。在添加引用时,可以在 “引用” 文件夹中查找并添加名为 “System.Transactions” 的程序集。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/lmy_520/article/details/131474358