我有一個使用了大量SqlTranaction調用現有的應用程序。該應用程序的構建方式,我們得到了一堆代碼,看起來有點像這樣(爲簡便起見錯誤處理等去掉):我應該如何將SqlTransaction遺留代碼與TranactionScope集成?
Using transaction As SqlTransaction = Database.CreateSqlTransaction()
If Not Me.FitnessSession.FitnessTestSessionID.HasValue Then
Me.FitnessSession.Insert(transaction)
Else
Me.FitnessSession.Update(transaction)
End If
SaveTestScores(transaction)
Database.CommitTransaction(transaction) 'This essentially just calls transaction.Commit()
End Using
我們在開溝出手卷DAL和移動到LINQ的過程到SQL,但這將是增量式的,因爲我們沒有預算來簡單地丟棄所有我們的遺留代碼。因此,我們將在我們需要使用我們的舊代碼和Linq到SQL代碼的所有領域都處於同一事務中。我相信這可以這樣做:
Using scope As New TransactionScope()
Using transaction As SqlTransaction = Database.CreateSqlTransaction()
If Not Me.FitnessSession.FitnessTestSessionID.HasValue Then
Me.FitnessSession.Insert(transaction)
Else
Me.FitnessSession.Update(transaction)
End If
SaveTestScores(transaction)
Database.CommitTransaction(transaction)
End Using
End Using
什麼我就被其承諾稱不清楚,我必須打電話scope.Complete()
或Database.CommitTransaction(transaction)
?或者還有其他一些選項將兩段代碼鏈接在一起?
跟進質詢,
感謝@編程英雄那是真正有用的,什麼我現在不能確定的是,我的時候應該關閉SQL連接?該DAL方法中的代碼使一個檢查,看是否已經通過了一項交易,如果有,那麼它使用對事務的連接並沒有關閉連接,一旦完成後,如果沒有交易過那麼新連接打開並關閉操作。如果我關閉了TransactionScope中的SqlConnection,這是否會導致環境事務出現問題?我問,因爲如果關閉具有SqlTransaction對象的SqlConnection,事務將回滾。
我同意。一個警告 - 'TransactionScope'將升級到一個分佈式事務(這是一個用於部署的PITA),除非所有數據訪問代碼共享一個打開的連接對象。 – 2010-01-04 17:45:27