<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元件設定:
步驟:
在控制台--->管理工具--->服務 中,開啟Distributed Transaction Coordinator 服務。
a.控制台->管理工具->元件服務->計算機->我的電腦->右鍵->屬性
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控制面版-->管理工具-->服務-->Distributed
Transaction Coordinator-->屬性-->啟動,啟動這個服務.示例代碼如下:
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;
二。另一種方法就是建立兩個事務,兩個連接配接了。代碼如下;
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 && conNorthwind != null)
commandNorthwind.Transaction.Rollback();
conNorthwind.Close();
if (commandPubs.Transaction!= null && conPubs != null)
commandPubs.Transaction.Rollback();
conPubs.Close();