而遍及式事务能够和煦三个数据库实例多少个会话之间的操作

背景:

     
事务是数据库处理体系的二个基本概念,事务有着三个为主特色,即ACID:原子性(Atomicity)、风华正茂致性(Consistency)、隔开分离性(Isolation)和悠久性(Durability),通过作业机制得以确认保障数据库的黄金年代致性和完整性。

     
可是数据库事务只好在数据库实例的同三个会话等第举行作业调整。而布满式事务能够和睦贰个数据库实例七个会话之间的操作,以致是三个数据库实例之间的数据库操作,并维持业务性格。然而规格上大家不推荐使用遍及式事务,因为布满式事务对财富消耗比较多,推行效用很差。

     
然则间接以来,大家对布满式事务的代码应用和功能都留存误解:使用了TransactionScope就一定会开启布满式事务吗?

 

验证:

     
大家做八个轻松的德姆o:多少个一而再再而三字符串完全相通,ADO.NET会复用连接池中的连接,结果会怎么样?

    using (TransactionScope ts = new TransactionScope())
    {
        SqlConnection conn;
        conn = new SqlConnection("server=.;uid=tkk123;pwd=aaaaaa");

        conn.Open();
        SqlCommand cmd = conn.CreateCommand();
        cmd.CommandText = "select 1 as tkk";
        cmd.ExecuteNonQuery();
        conn.Close();

        conn = new SqlConnection("server=.;uid=tkk123;pwd=aaaaaa");
        conn.Open();
        cmd = conn.CreateCommand();
        cmd.CommandText = "select 2 as tkk";
        cmd.ExecuteNonQuery();
        conn.Close();

        ts.Complete();
    }

    Console.WriteLine("OK");
    Console.ReadKey();

 

殊不知的事体爆发了,并不曾观察大家的以为的遍及式事务!!!

图片 1

 

小编们改动内部的叁个连续字符串,使得ADO.NET感到是三个数据源,那样才会真正意义上张开布满式事务。

    using (TransactionScope ts = new TransactionScope())
    {
        SqlConnection conn;
        conn = new SqlConnection("server=.;uid=tkk123;pwd=aaaaaa");

        conn.Open();
        SqlCommand cmd = conn.CreateCommand();
        cmd.CommandText = "select 1 as tkk";
        cmd.ExecuteNonQuery();
        conn.Close();

        conn = new SqlConnection("server=.;uid=tkk123;pwd=aaaaaa;"); --加了一个分号,不共享连接
        conn.Open();
        cmd = conn.CreateCommand();
        cmd.CommandText = "select 2 as tkk";
        cmd.ExecuteNonQuery();
        conn.Close();

        ts.Complete();
    }

    Console.WriteLine("OK");
    Console.ReadKey();

 

让我们看一下布满式事务是何许和煦每一个数据库连接,当前的案例大家采纳的是同多少个数据库,所以即便成立了四个数据库连接,但结尾在数据库层面依然是相仿业务ID。

万风华正茂我们展开的是多个分歧数据库实例,将走访到哪些的结果吧? try
it。。。

图片 2

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website