2009-12-31 40 views
3

考慮這種情況;假設我有WPF窗口,它有四個對象綁定到其控件 (Schedule,Customer,Contract,ScheduleDetails和Signer),它們代表後端數據庫中的四個數據庫表。我希望當用戶請求保存他/她在原子操作中加入的信息時,換句話說,所有的保存操作都在一個事務中,以使所有操作成功或全部失敗。 我的問題是什麼是代表在這種情況下如何在交易中保存?

回答

4

事務操作的最有效的方式最有效是使用BeginTransaction等您DbConnection,但這並不方便,因爲你必須使用相同的連接,每個DbCommand需要transaction設置等

簡單TransactionScope,如果你是SQL-Server 2005或以上,你很少會注意到這一點,並BeginTransaction之間顯著的性能差異:

using(var tran = new TransactionScope()) { 
    SaveA(); 
    SaveB(); 
    SaveC(); 
    SaveD(); 
    tran.Complete(); 
} 

這並不重要,如果SaveA等使用相同的連接,如SqlConnection將自動登記到一個TransactionScope

或者,讓一個ORM爲你處理;大多數會創建交易以保存一組更改。

有一點要注意; TransactionScope依賴於可能不適用於所有客戶端的服務(DTC)(因爲您提到的是客戶端的WPF)。

+1

如果您使用TransactionScope,請確保您的目標機器具有運行的DTC - 分佈式事務處理協調器服務,否則您將收到異常。 – 2009-12-31 13:29:45

+0

@Chris - 我剛剛編輯完畢;-p – 2009-12-31 13:30:27

+1

@Mark,謝謝。但是DTC和Transaction類之間有一個關係 - 我不記得什麼時候談到圖片 - 但是我想避免使用DTC的開銷,儘管我喜歡Transaction類的簡單形式。 DTC交易有沒有辦法入伍? – 2009-12-31 13:34:36