TransactionScope期望按如下方式調用其Complete方法。否則,交易將不會被提交。爲什麼TransactionScope不會成功?
using(TransactionScope scope = new TransactionScope())
{
/* Perform transactional work here */
scope.Complete();
}
那麼假設成功的實現更合適嗎?這意味着在標準情況下(成功)將需要更少的代碼。
在異常或呼叫給方法的情況下爲「回滾」(該方法目前不存在),例如事務可以被回滾。
using(TransactionScope scope = new TransactionScope())
{
/* Perform transactional work here */
if(problemOccurred)
{
scope.Rollback();
}
}
請注意,只有在問題未導致異常的情況下,纔會需要problemOccurred標誌。在這種情況下,回滾將自動執行。
我感興趣的獲得進一步瞭解爲什麼使用此實施。
更新:迄今爲止的一些答案認爲,如果使用我描述的實現,則需要try-catch塊。不是這種情況。當在使用塊中未處理異常時,事務自動回滾。現有的實施和我描述的都是這種情況。有關更多詳細信息,請參閱「完成交易範圍」部分here。
更新2:我終於明白髮生了什麼的答案被解釋。這不是一種語言結構,它可以用語言設計者認爲合適的任何方式進行解釋 - 它是IDisposable模式的實現。如果沒有調用完成Dispose方法內的代碼,則不知道它是否被調用,因爲正在成功執行using塊中的代碼或發生異常。我想象的事物和回滾都是關鍵字。
transaction
{
/* Perform transactional work here */
if(problemOccurred)
{
rollback;
}
}
如果事務選項需要傳遞給TransactionScope,這當然會出現問題。
爲什麼不是我的評論自動添加當我改變頁面,我不應該單擊[添加評論] ... – cjk 2010-01-04 13:20:37
從更新 - * *機制,通過該交易在例外的臉回滾是你在不調用Commit的情況下到達使用塊的末尾。即該行爲取決於您要刪除的確切功能。 – 2010-01-04 14:12:55
你的「更新」是指當前的遊戲狀態 - 如果TransactionScope假定成功,你會改變這種情況。 – 2010-01-04 14:15:01