.Net TransactionScope事務


使用TransactionScope類

正如名稱所暗示,TransactionScope類用於限定事務代碼塊,其具有一些明顯優點,例如范圍與應用程序對象模型無關,同時提供了一個簡單直觀的編程模型等等。在該類的構造函數內部,TransactionScope對象創建了一個事務(.NET 2.0中默認時輕量級事務管理器),同時將該事務設置給Transaction類的Current屬性。由於TransactionScope是可釋放對象,所以事務將調用Dispose()方法釋放該對象:

 

using(TransactionScope scope = new TransactionScope())
{
/*在這里實現事務性工作 */
// 沒有錯誤——提交事務
scope.Complete();
}

 

示例2列舉了一種在.NET 2.0中創建事務的方法。在TransactionScope對象定義的代碼塊中創建和釋放該對象。使用TransactionScope對象的構造函數和TransactionScopeOption枚舉,開發人員能夠定義是否需要新事務,或者是否應該使用已經在外部塊中存在的事務。TransactionScope.Complete()方法指示事務范圍內的所有操作都已成功完成。在using語句結尾處(調用Dispose()方法的位置),定義了事務塊的輸出。如果由於發生異常而沒有調用Complete()方法,那么放棄事務。如果在事務范圍內成功完成,則如果事務是根事務,那么當事務是根事務時就提交事務。如果范圍內的不是根事務,那么會影響事務輸出。

例2:使用TransactionScope實現隱式事務

 

<%@ Page Language="C#" %> 
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SqlClient" %>
<%@ Import Namespace="System.Transactions" %>
<%@ Import Namespace="System.Web.Configuration" %>







Width="179px">
 
OnClick="btnSave_Click" />




Font-Size="Small" />
 

 

在示例2中,對於Mydatabase數據庫執行插入的SQL語句包括在使用using塊的TransactionScope對象中。InsertCategroy()方法執行實際的向ProductCategory表插入新記錄的工作。在插入記錄后,該方法向調用者返回新近插入記錄的標識值(類別ID列)。一旦代碼成功執行,則調用TransactionScope對象的Complete()方法,以便告知.NET Framework語句已經成功執行完成,事務導致的結果將提交給數據庫。

 

以下是TransactionScope所完成的一些內容: 

出現在using語句括號中的任何語句將在事務范圍內執行。 
任何在塊中創建的連接將在事務中登記。 
如果在using塊中發生錯誤,則事務將自動回滾。 
如果語句成功執行,那么作為工作的一部分,需要在事務中調用Complete()方法。 
調用堆棧的每一步必須調用Complete(),以便提交事務。

TransactionScope對象無法了解是否應該提交或者放棄事務,TransactionScope的主要目標是避免開發人員與事務直接交互。為了解決這個問題,每個TransactionScope對象都有一個一致性位,其默認設置為false。通過調用Complete()方法能夠將一致性位設置為true。注意,只能調用一次Complete()。后續對Complete()的調用將引發InvalidOperation異常,因為在調用Complete()之后,不能保證還有事務性代碼。

ASP.NET中的自動化事務

通過在ASP.NET頁面中添加Transaction屬性,可使得ASP.NET能夠在系統中支持自動事務。利用Transaction屬性,開發人員能夠指示頁面參與現有事務,開始新事務,或者不參與事務。下表列舉了ASP.NET中可用的Transaction屬性值。

圖片部分的源代碼:

圖1

 

 事例:

 using (TransactionScope tsCope = new TransactionScope())
            {
                var sailorLetterApplyForm = _sailorLetterApplyFormRepository.Get(Id);

                if (sailorLetterApplyForm != null)
                {
                    _sailorLetterApplyFormRepository.Remove(sailorLetterApplyForm);
                    _sailorLetterApplyFormRepository.UnitOfWork.Commit();
                }
                else
                    LoggerFactory.CreateLog().LogWarning("不能刪除不存在的證書申請");
                tsCope.Complete();
            }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM