2009-08-31 65 views
2

我寫了一個代碼塊來執行SQL Server數據庫中的數據庫事務。我正在使用TransactionScope類來回滾所有更改,如果在執行過程中出現任何故障。 如果我在運行SQL SERVER的系統中運行應用程序,我沒有問題。 如果我在系統中運行應用程序,並且SQL SERVER正在另一個系統中運行,我收到一個MSDTC被禁用的錯誤。.NET應用程序中的TransactionScope

如果我能夠在DBSERVER的MSDTC正在運行的系統,我的應用程序工作正常。

如果我必須使用ORACLE db,系統將如何工作?我應該在ORACLE數據庫服務器上配置什麼來啓用事務範圍?請幫幫我。

謝謝, P.Gopalakrishnan。

回答

1

TransactionScope雖然在概念上很簡單,但在幕後隱藏了許多魔力。它使您能夠使用分佈在多臺機器上的一個事務。爲此,它需要來自數據庫的複雜支持 - 而且開銷可能很高,也可能不高。

一個更簡單更有限的技術產品,並可滿足您:DbTransaction。您的Db提供程序可以使用類似於sql的BEGIN TRANSACTIONCOMMIT TRANSACTION的語義實現一個事務:簡而言之,該事務僅跨單個計算機上的單個連接。

你的代碼會看起來像......

DbCommand cmd = ...; 
using (DbTransaction trans = Connection.BeginTransaction()) { 
    cmd.Transaction = trans; //sometimes optional, though MS-SQL requires it. 

    cmd.ExecuteNonQuery() 
    [...other db commands with the same connection and transaction...] 
    trans.Commit(); 
} 

要一清二楚:您可以使用其他幾個連接,而交易是開放的 - 但它們之間沒有任何聯繫。在不同的連接上執行的命令不會在事務中止時回滾(就像任意C#代碼在事務中止時不會回滾)。

這種做法是重量更輕,更細粒度的,並且適用於更廣泛的數據庫供應商,它不需要MSDTC啓動。另一方面,事務是特定於連接的(如果您有多個連接,它們不共享事務),它們不能分發,並且您需要手動將命令登記到事務中(至少對於MS -SQL)。

請注意,如果您無法在一個事務中登記命令,MS-SQL會拋出異常,SQLite的將仍然隱含招收命令,我不知道做什麼預言。因爲所有命令必須無論如何都要註冊到事務中,這只是一個不常用的冗餘API,但它並不是非常有問題。

0

TransactionScope支持(混合)快速本地事務,並提供選項,以便在需要時將它們提升爲更昂貴的分佈式事務。對於分佈式事務,MSDTC是必需的。

理由來促進分佈式事務是如果涉及相同的TransactionScope第二個數據庫。

Oracle數據提供程序版本10.2.0.3和更高確實支持本地事務+分佈式事務(相同的SQL Server 2005及更高版本)。較早版本的ODP.NET僅支持分佈式事務。