如果在WEB服務中有這樣一個場景,某個WEB服務的方法要執行兩個任務,它首先要在資料庫中建立一個新表,接着調用對象來收集和格式化資料,并在新表中插入資料。象這樣的一組方法,我們必須保證他們都成功執行,否則會造成很多髒資料在系統中,這時事務就出場了。
關于事務的基本概念再次就不過多涉及,隻需要記住它的四個屬性ACID即可。
WEB服務中的事務是用WebMethod特性的TransactionOption屬性來申明的。如果WEB服務方法執行時發生異常,則自動會終止事務,反之則送出事務。WEB服務的方法僅有兩種可能的行為:Disabled,NotSupported,Supported表示不參與事務;Required,RequiresNew表示建立一個新的事務。意思是說當TransactionOption的屬性為Required或RequiresNew的WEB服務方法調用另一個TransactionOption的屬性為Required或RequiresNew的WEB服務方法時,每個WEB服務方法将參與他們自己的事務。
PS:WEB服務方法的TransactionOption預設屬性為Disabled
同時我們也可以顯示調用System.EnterpriseServices.ContextUtil類的SetAbort方法取消事務,調用SetCompleted方法完成事務。
例子:
using System.EnterpriseServices;
Class WebServiceTransaction:WebService
{
pulic void Write(string user,string msg)
{
//将接收這兩個參數寫入資料庫。。。
}
[WebMethod(TransactionOption=TransactionOption.RequiresNew)]
public void WiteToDataBasev1(string user,string msg)
Write(user,msg);
if(user!="kim")
{
string msg="sorry,you can not access";
throw new UnauthorizedAccessException(msg);
}
public void WiteToDataBaseV2(string user,string msg)
ContextUtil.SetAbort();
else
ContextUtil.SetComplete();
}
測試和預期完全正确。
本文轉自左正部落格園部落格,原文連結:http://www.cnblogs.com/soundcode/archive/2011/05/25/2056864.html,如需轉載請自行聯系原作者