TransactionScope实现多数据库连接事务操作

当应用程序需要在多个数据库中进行事务性操作的时候,使用TransactionScope类可以方便地实现应用程序的这一需求。只要对多个数据库的操作代码位于同一个事务范围内,即可实现多数据库连接的事务操作。

技术要点

本示例主要说明了如何在程序中使用TransactionScope实现多数据库连接事务操作,技术要点如下。

—    因为位于同一个事务范围内的不同的数据库操作,程序视为同一个事务,所以使用事务范围能够简便地实现多数据连接的事务操作。

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

实现步骤

(1)创建控制台应用程序项目,命名为“MultiDatabaseTransactionScope”。

(2)打开并编辑Program.cs文件,代码如下所示。

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("取消事务提交");

                }

            }

        }

    }

}

(3)按F5键运行程序,运行结果如下所示。

数据库1的命令已执行

数据库2的命令已执行

是否提交事务?(Y/N)y

事务提交完成

源程序解读

本示例程序创建了一个事务范围,并在该事务范围内创建两个不同的数据库连接,并通过SqlCommand类实例执行数据操作,最后通过用户的键盘输入决定是否提交两个数据库连接中的数据操作事务。

posted @ 2010-09-17 16:32  英雄不问出处  阅读(530)  评论(0编辑  收藏  举报