2009-02-12 82 views
69

什麼是LINQ經典的交易模式之間的差異,以SQL LIKE:的TransactionScope VS在LINQ交易到SQL

using(var context = Domain.Instance.GetContext()) 
{ 
    try 
    { 
     context.Connection.Open(); 
     context.Transaction = context.Connection.BeginTransaction(); 
     /*code*/ 
     context.Transaction.Commit(); 
    } 
    catch 
    { 
     context.Transaction.Rollback(); 
    }   
} 

VS的TransactionScope的對象

using (var context = Domain.Instance.GetContext()) 
using (var scope = new TransactionScope()) 
{ 
    try 
    { 
     /*code*/ 
     scope.Complete(); 
    } 
    catch 
    { 
    } 
} 

回答

34

Linq2SQL將使用隱式事務。如果您的所有更新都是在單個提交中完成的,則您可能無需親自處理交易。

從文檔(重點礦山):

當你調用的SubmitChanges,LINQ到SQL檢查,看看通話是否在交易的範圍,或者如果事務屬性(IDbTransaction)設置爲用戶啓動的本地事務。 如果它找不到事務,則LINQ to SQL啓動一個本地事務(IDbTransaction)並使用它來執行生成的SQL命令。當所有SQL命令都成功完成時,LINQ to SQL提交本地事務並返回。

+10

如果您需要提交具有循環屬性(常見)的內容,那麼您會遇到LINQ to SQL中的一個錯誤,該錯誤要求您刪除每個雙向引用的一部分,提交,修復雙向引用並再次提交。您需要將所有這些包裝在自己的交易中才能這樣做。這是一個普遍的需求,所以「不要擔心」不是最好的答案。 – 2011-07-12 14:56:03

4

我相信他們基本上是相同的TransactionScope類將與ADO.NET底層連接進行接口以創建並提交或回滾事務。 TransactionScope類只是爲了使用ADO.NET持久性清理器而創建的。

編輯:澄清我的問候casperOne's addition聲明它是將創建事務,然後連接將看到由TransactionScope創建的事務,並使用它,因爲它是提供給它的TransactionScope的。

+0

@Christ Marisic:這是相反的方式。連接將查找當前線程的Transaction,並由TransactionScope創建。如果有的話,那麼它就會參與交易。協調者然後將告訴連接提交或回滾。 – casperOne 2009-02-12 18:42:22

69

應該注意的是,當使用TransactionScope時,您不需要try/catch構造。您只需在範圍上調用Complete即可在範圍退出時提交事務。

也就是說,TransactionScope通常是更好的選擇,因爲它允許您將調用嵌套到可能需要事務的其他方法,而無需傳遞事務狀態。

當在DbConnection對象上調用BeginTransaction時,如果要在同一個事務中執行其他操作,但使用其他方法,則必須傳遞該事務對象。

使用TransactionScope,只要範圍存在,它將處理在線程上註冊的所有內容,使您的代碼更乾淨,更易於維護。

最重要的是,您還可以使用其他可以參與事務的資源,而不僅僅是連接到數據庫。

需要注意的是,在需要充分利用連接和數據庫操作的情況下,您可能不想使用TransactionScope;即使針對單個數據庫,也可以使用分佈式事務協調器,並將事務轉換爲分佈式事務(即使是單個數據庫連接)。

在這種情況下,而弄髒了你的設計,你可能要考慮周圍路過連接特定的交易。如果你知道你將一致地使用一個資源(並且在同一個線程上),你可能想創建一個引用計數你的連接/事務的類。

您將創建一個在施工時創建資源/增加計數的類。它也會執行IDisposable(當計數爲零時,你可以遞減/釋放/提交/中止),並將計數存儲在一個變量中,該變量對其應用ThreadStaticAttribute

這可以讓你的事務管理從邏輯代碼中分離出來,並仍持有到一個單一的資源相當有效的(而不是升級爲分佈式事務)。

+0

如果我使用單一連接與交易然後不是它是同樣的事情?我的意思是你避免分佈式事務。 – GorillaApe 2012-10-26 15:50:00

+0

@Parhs取決於你是否有其他交易資源在單一數據庫連接的事務中登記。 – casperOne 2012-10-26 16:11:19

19

一個很大的區別(經驗教訓很難) - TransactionScope使用MS DTC進行事務管理。

如果您的應用程序只管理數據庫事務,並沒有任何服務或遠程調用都參與其中,您可以通過使用交易原產於數據庫(DbTransactions)跳過有關MS DTC的潛在問題。

4

TransactionScope的物資統一管理所有資源經理(SQL服務器,活動目錄,文件系統,...)。此外,可以編寫自己的資源管理器:檢測事務範圍的代碼,加入SQL Server並像SQL Server一樣工作:像其他事務參與者一樣提交或恢復更改。我相信TransactionScope是主流的,並且忘記了MS SQL本地事務,直到失敗陷入巨大的陷阱: Windows Server 2008 WEB Edition附帶受限的分佈式事務處理協調器服務,事務範圍僅適用於單臺計算機。 如果IIS和SQL服務器安裝在不同的計算機上,則您的ASP.NET應用程序將在此係統上失敗。考慮到大多數公共領域提供商提供的Windows Server WEB版和SQL服務器位於不同的服務器上。這意味着,你必須使用明確的交易管理與本地交易...