sundajade

博客园 首页 联系 订阅 管理

DTC(Distributed Transaction Coordinator) 分布式事务处理,按照使用方式的不同分布式事务的复杂程度也不同,

基于本地事务的多资源管理器和基于SOA的面向服务的多资源管理器。由于本地事务处理是基于本地事务管理器的,所以它不能管理分布式的事务,一旦当我们处理的事务范围要进行扩大时并且是夸机器的访问时,那么本地事务管理器将自动提升为分布式事务管理器也就是DTC(分布式事务协调器)

 

MSDN:CommittableTransaction 类为应用程序使用事务提供了一种显式方法,而不是隐式地使用 TransactionScope 类。与 TransactionScope 类不同,应用程序编写器需要明确调用 Commit Rollback 方法以提交或中止事务。 但是,只有事务的创建者才能提交事务。 因此,通过 Clone 方法获得的可提交事务的副本不是可提交的.

 

显示事物:

1.ADO.NET事务

public void Add2()
        {
            using (DbConnection con = new SqlConnection(this._conStr))
            {
                con.Open();
                using (DbTransaction tranaction = con.BeginTransaction())
                {
                    try
                    {
                        DbCommand command = con.CreateCommand();
                        command.Transaction = tranaction;
                        command.CommandText = "insert into test2 values(111)";
                        command.ExecuteNonQuery();
 
                        DbCommand command3 = con.CreateCommand();
                        command3.Transaction = tranaction;
                        command3.CommandText = "insert into test values(222)";
                        command3.ExecuteNonQuery();
 
                        tranaction.Commit();
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(ex);
                        tranaction.Rollback();
                    }
                }
            }

        }

2.显示事务 CommittableTransaction

private readonly string _conStr = "data source=.;Initial Catalog=DataMedicine;Integrated Security=SSPI";

        public void Add()

        {

            //注:CommittableTransaction类继承自Transaction

            CommittableTransaction committran = new CommittableTransaction();

            using (DbConnection conn = new SqlConnection(this._conStr))

            {

                conn.Open();

                conn.EnlistTransaction(committran);//需要将本次的连接操作视为事务性的

 

                try

                {

                    DbCommand command = conn.CreateCommand();

                    command.CommandText = "insert into test2 values(111)";

                    command.ExecuteNonQuery();

 

                    command = conn.CreateCommand();

                    command.CommandText = "insert into test values(222)";

                    command.ExecuteNonQuery();

 

                    committran.Commit();

                }

                catch (Exception ex)

                {

                    Console.WriteLine(ex);

                    committran.Rollback(); //出现出错执行回滚操作

                }

            }

        }

3.隐式事务 TransactionScope

public void ImplicitTransaction()

        {

            using (TransactionScope scope = new TransactionScope())

            {

                using (DbConnection conn = new SqlConnection(this._conStr))

                {

                    conn.Open();

                    DbCommand command = conn.CreateCommand();

                    command.CommandText = "insert into test2 values(111)";

                    command.ExecuteNonQuery();

 

                    command = conn.CreateCommand();

                    command.CommandText = "insert into test values(222)";

                    command.ExecuteNonQuery();

 

                    using (DbConnection conn2 = new SqlConnection(this._conStr2))

                    {

                        conn2.Open();

                        DbCommand command2 = conn2.CreateCommand();

                        command2.CommandText = "insert into test2 values(111)";

                        command2.ExecuteNonQuery();

 

                        command2 = conn2.CreateCommand();

                        command2.CommandText = "insert into test values(222)";

                        command2.ExecuteNonQuery();

 

                        scope.Complete();

                    }

                }

            }

        }

4.显示事务CommittableTransaction类和隐式事务TransactionScope都支持分布式事务,单库操作时为本地事务,当为多库操作时自动升级为分布式事务,前提是相关的服务必须已经启动,比如Distributed Transaction Coordinator.

posted on 2016-04-27 21:03  sundajade  阅读(265)  评论(0)    收藏  举报