C#事务处理SqlTransaction

2022-01-19  本文已影响0人  大龙10

《Visual C# 2008开发技术实例详解》读书笔记
作者:李继攀等
出版社:电子工业出版社
出版时间:2008-08

一、事务处理

  事务处理是一种机制,用来管理必须成批执行的SQL操作,以保证数据库不包含不完整的操作结果。

二、术语

三、.NET的处理方式

  事务处理是包含一个或多个任务的一组关联操作的提交或回滚操作。在事务执行的过程中,保证事务具有基本的ACID属性(原子、一致性、隔离和持久性)。
  .NETFramework的事务管理支持多种事务处理方式,包括显性事务和隐性事务、本地事务和分布式事务、事务嵌套、事务升级等,同时包含了三种主要信任级别:AllowPartiallyTrustedCallers(APTCA)信任级别、Distributed Transaction Permission(DTP)信任级别和完全信任级别。

四、使用SqlTransaction实现数据库操作事务

  要使用事务处理应在程序头部引用System.Transactions命名空间。
  SqlTransaction类是对SQL Server数据库进行事务处理的类,该类的实例由SqlConnection类实例的BeginTransaction方法创建,表示在该数据库连接实例上开始一个数据库事务,创建SqlTransaction类实例后,在程序中使用该实例的Commit方法提交事务,或者使用该类的Rollback方法回滚事务。

五、多数据库连接事务操作实例

  在事务范围内应调用且仅仅调用一次Complete方法,当事务范围的Complete方法调用时,事务范围中的数据操作尝试提交,提交失败时自动回滚,如果在事务范围内未执行Complete方法,则导致事务范围在操作未提交的情况下结束。

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Transactions;
    using System.Data;
    using System.Data.SqlClient;
    namespace MultiDatabaseTransactionScope
    {
        class Program
        {
            static void Main(string[] args)
            {
              //在创建的事务范围实例内运行代码
                using (TransactionScope ts = new TransactionScope())
                {
                    //连接数据库1的字符串
                    string ConnectionString1 = @"Data Source = localhost; Initial Catalog = Northwind; Integrated Security = SSPI;";
                    //创建数据库1连接类实例1
                    SqlConnection conn1 = new  SqlConnection(ConnectionString1);
                    //创建数据库1命令类实例1
                    SqlCommand command1 = new SqlCommand(@"INSERT Shippers(CompanyName,Phone)   VALUES('Test Ship2','0000-0002')", conn1);
                    conn1.Open();//连接数据库1
                    command1.ExecuteNonQuery();//在数据库1上执行命令
                    Console.WriteLine("数据库1的命令已执行");
                    conn1.Close();//关闭数据库1
                    //连接数据库2的字符串
                    string ConnectionString2 = @"Data Source = localhost; Initial Catalog =pubs; Integrated Security = SSPI;";
                    //创建数据库2连接类实例2
                    SqlConnection conn2 = new SqlConnection(ConnectionString2);
                    //创建数据库2命令类实例2
                    SqlCommand command2 = new SqlCommand(@"INSERT Discounts(Discounttype,Discount) VALUES('Other',12)", conn2);
                    conn2.Open();//连接数据库2
                    command2.ExecuteNonQuery();//在数据库2上执行命令
                    Console.WriteLine("数据库2的命令已执行");
                    conn2.Close();//关闭数据库2
                    Console.Write("是否提交事务?(Y/N)");
                    if (Console.ReadKey(false).Key == ConsoleKey.Y)
                    {
                        ts.Complete();//提交事务
                        Console.WriteLine("");
                        Console.WriteLine("事务提交完成");
                    }
                    else
                    {
                        Console.WriteLine("取消事务提交");
                    }
                }
            }
        }
    }
```
上一篇 下一篇

猜你喜欢

热点阅读