天天看點

TransactionScope使用說明

<a href="http://www.189works.com/article-85378-1.html">http://www.189works.com/article-85378-1.html</a>

如果在C#中使用TransactionScope類(分布式事務),則須注意如下事項:

1、在項目中引用using System.Transactions命名空間(先要在添加net元件的引用);

3、對MSDTC元件設定:

 步驟:

  在控制台---&gt;管理工具---&gt;服務 中,開啟Distributed Transaction Coordinator 服務。

 a.控制台-&gt;管理工具-&gt;元件服務-&gt;計算機-&gt;我的電腦-&gt;右鍵-&gt;屬性

 b.選擇MSDTC頁, 确認"使用本地協調器"

 c.點選下方"安全配置"按鈕

 d.勾選: "允許網絡DTC通路","允許遠端用戶端","允許入站","允許出站","不要求進行身份驗證".

 e.對于資料庫伺服器端, 可選擇"要求對呼叫方驗證"

 f.勾選:"啟用事務Internet協定(TIP)事務"。

 g.在雙方防火牆中增加MSDTC.exe例外

   可用指令行: netsh firewall set allowedprogram %windir%\system32\msdtc.exe MSDTC enable

4、重新開機IIS伺服器。

注意:

我們隻要確定資料庫的打開操作是在事務範圍内打開就行了。這樣就可以做到事務的正确操作。

如果WEB伺服器和資料庫是在同一台伺服器上,TransactionScope使用的是本地事務,這時不需要配置MSDTC。

如果WEB伺服器和資料庫不在同一台伺服器上,TransactionScope會自動提升事務級别為分布式事務,這時就需要配置MSDTC。配置很簡單的,網上有教程,做兩次就知道了。

在程式的開發過程中,對資料庫的增删改通常要用到事務,用來實作的全部更新和全部復原。單資料庫還比較好做,如果遇到同時操作多個資料庫增删改,可以用下面的方法

 一。TransactionScope類

     TransactionScope類是framework2.0 新增的一個類,在System.Transactions命名空間中,使用時必須先添加System.Transactions引用;另外還要在windows控制面版--&gt;管理工具--&gt;服務--&gt;Distributed

Transaction Coordinator--&gt;屬性--&gt;啟動,啟動這個服務.示例代碼如下:

TransactionScope使用說明
TransactionScope使用說明
TransactionScope使用說明

Code

  try

            {

                using (TransactionScope scope = new TransactionScope())

                {

                    //更新northwind資料庫的Employees表

                    using (SqlConnection conOne = new SqlConnection("server=.;uid=sa;pwd=123;database=northwind"))

                    {

                        conOne.Open();

                        SqlCommand command = new SqlCommand("update Employees set lastname='chen' where employeeid='1'", conOne);

                        int i = command.ExecuteNonQuery();

                    }

                    //更新pubs資料庫的jobs表

                    using (SqlConnection conTwo = new SqlConnection("server=.;uid=sa;pwd=123;database=pubs"))

                        conTwo.Open();

                        SqlCommand command = new SqlCommand("update jobs set job_desc='chen' where job_id='1'", conTwo);

                    scope.Complete();  //送出事物

                }

            }

            catch (Exception ex)       //發生異常後自動復原

                //throw;

TransactionScope使用說明

二。另一種方法就是建立兩個事務,兩個連接配接了。代碼如下;

TransactionScope使用說明
TransactionScope使用說明
TransactionScope使用說明

    SqlConnection conNorthwind = new SqlConnection("server=.;uid=sa;pwd=123;database=northwind");

            SqlConnection conPubs = new SqlConnection("server=.;uid=sa;pwd=123;database=pubs");

            SqlCommand commandNorthwind = new SqlCommand();

            SqlCommand commandPubs = new SqlCommand();

            try

                conNorthwind.Open();

                conPubs.Open();

                //更新northwind資料庫的Employees表

                SqlTransaction tranNorthwind = conNorthwind.BeginTransaction();

                commandNorthwind.Connection = conNorthwind;

                commandNorthwind.Transaction = tranNorthwind;

                commandNorthwind.CommandText = "update Employees set lastname='chen' where employeeid='1'";

                int i = commandNorthwind.ExecuteNonQuery();

                //更新pubs資料庫的jobs表

                SqlTransaction tranPubs = conPubs.BeginTransaction();

                commandPubs.Connection = conPubs;

                commandPubs.Transaction = tranPubs;

                commandPubs.CommandText = "update jobs set job_desc='chen' where job_id='1'";

                int k = commandPubs.ExecuteNonQuery();

                //throw new Exception();

                //送出事務

                commandNorthwind.Transaction.Commit();

                conNorthwind.Close();

                commandPubs.Transaction.Commit();

                conPubs.Close();

            catch (Exception ex)

                //復原事務

                if (commandNorthwind.Transaction != null &amp;&amp; conNorthwind != null)

                    commandNorthwind.Transaction.Rollback();

                    conNorthwind.Close();

                if (commandPubs.Transaction!= null &amp;&amp; conPubs != null)

                    commandPubs.Transaction.Rollback();

                    conPubs.Close();

TransactionScope使用說明