天天看點

ADO.NET中事務的了解與應用

      事務(Transaction),是指一個工作單元,在這個整體中所有對資料庫的操作要麼全部執行成功,要不全不執行,用"不成功,便成仁"來形容比較恰當。

     (1)、在ADO.NET中,使用Connection對象的BeginTransaction方法來初始化Transaction對象,然後将該對象指派給Command對象的一個屬性Transaction,執行對資料庫的操作,若成功,則調用Transaction對象的Commit方法來送出事務,如若失敗,則調用Transaction對象的RollBack方法進行事務的復原。下面就來寫下具體的操作代碼:

    .....

    using System.Data.SqlClient;

   ......

    string strSQL = string.Empty;

    using(SqlConnection con = new SqlConnection("資料庫連接配接字元串"))

   {

          con.Open();

          SqlTransaction trans = con.BeginTransaction();

          SqlCommand cmd = null;

          cmd.Connection = con;

          cmd.Transaction = trans;

          try

          {

                  strSQL = "insert into Users values('admin','admin')";

                  cmd.CommandText = strSQL;

                  cmd.ExecuteNonQuery();

                  strSQL = "update Users set pwd= ' "+admin888 + " ' where uid=admin";

                  cmd.CommandText = strSQL;

                  trans.Commit();

          }

          catch(SqlException ex)

                  Response.Write(ex.Message);

                  Trans.RollBack();

   }

 (2)、分布式事務

         在網站開發中,我們經常會遇到這樣一種情況,由于網站通路量非常大,注冊的使用者又比較多,一台伺服器難以儲存衆多的使用者資訊,怎麼辦呢?

         通常的做法是,使用二個或二個以上的伺服器,将使用者的登入資訊放在中心機房的SQL Server資料庫伺服器中,而将使用者的物品消費資訊放在另外一個伺服器中,這樣每次新增加一個使用者的話,就得在中心機房的資料庫伺服器中增加一個使用者的資訊,同時在另外一個伺服器上也得相應增加該使用者以及相關的消費資訊,這裡同樣涉及到事務問題,若增加成功,兩台資料庫伺服器中應同時增加了使用者的資訊,若一台伺服器上出現錯誤,未能儲存使用者的資訊,則另外一台伺服器上也不能儲存資料,既是事務整體送出失敗,復原到操作前的狀态.

        像上面的這種情況,涉及到多個資料庫伺服器,就牽涉到在2個或2個以上的SqlConnection對象上執行事務,這就是分布式事務處理。

        分布式事務處理,要用到System.Transaction命名空間下的TransactionScope類,在使用之前首先添加System.Transactions.dll

的引用.具體的操作代碼如下:

       ......

       string strSQL = string.Empty;

       using(TransactionScope scope = new TransactionScope())

       {

             SqlConnection con1 = new SqlConnection("資料庫連接配接字元串1");

             SqlConnection con2 = new SqlConnection("資料庫連接配接字元串2");

             try

             {

                    con1.Open();

                    strSQL = "insert into Users values('admin','admin')";

                    SqlCommand cmd1 = new SqlCommand(strSQL,con1);

                    cmd1.ExecuteNonQuery();

                    con2.Open();

                    strSQL = "insert into Consumption values('100','admin')";

                    SqlCommand cmd2 = new SqlCommand(strSQL,con2);

                    cmd2.ExecuteNonQuery();

             }

             catch(SqlException ex)

             {

                    Response.Write(ex.Message);

             scope.Complete();

             con1.Close();

             con2.Close();

       }

       .........

       分布式事務的處理并不是由ADO.NET來管理的,而是由MSDTC服務來管理的,這是一個基于COM+的技術,DTC是Distributed Transaction Coordinator的縮寫,既是分布式服務協調者的意思,由此也可以看出它的作用。

       TransactionScope類所支援的分布式事務管理,也并非由TransactionScope類來完成,而是送出給本地機上的DTC服務來完成的,是以在使用分布式事務時,要開啟本機的DTC服務,通過運作net start msdtc指令即可。