簡體   English   中英

在DAL中執行多個sql語句時調用TransactionScope.Complete

[英]Calling TransactionScope.Complete when executing multiple sql statements in DAL

我正在閱讀此書,似乎不需要調用scope.Complete可以使以下代碼正常工作。

當我嘗試在不使用scope.Complete()的情況下運行此記錄時,記錄將保存到數據庫中。 如果scope.Complete()存在,則記錄將保存,並且一切正常。

public static void SaveProducts(IList<Product> products)
{
    using (TransactionScope scope = new TransactionScope())
    {
        using (var connection = GetOpenConnection())
        {
            StringBuilder sqlDelete = new StringBuilder();
            sqlDelete.AppendLine("MY SQL STATEMENT HERE ");

            StringBuilder sqlInsert = new StringBuilder();
            sqlInsert.AppendLine("MY SQL STATEMENT HERE ");


            connection.Execute(sqlDelete.ToString(), new { CategoryId = categoryId });
            connection.Execute(sqlInsert.ToString(), products);

        }

        scope.Complete();
    }
}

根據文檔

未能調用此方法將中止事務,因為事務管理器將其解釋為系統故障或事務范圍內引發的異常。

我認為這是在說如果有什么問題出了錯,它將在發出完整信號之前進行處理。

我將在此處添加它,希望有更多的人閱讀

即使代碼中沒有更改數據庫的內容,也必須調用scope.Complete()。 如果您只是讀取數據庫,甚至不觸摸數據庫,請調用scope.Complete()

毫無疑問,何時應調用scope.Complete()或是否應調用scope.Complete()。 必須在退出TransactionScope using語句之前,或者如果范圍是手動創建的,則必須在調用Dispose()之前調用它。

如果您沒有這種習慣,請開始考慮代碼中正在發生的事情以及是否應該調用scope.Complete(),您的代碼將開始以隨機方式運行,無法提交,有時會提交(如果存在)如果是嵌套事務,則會看到它們失敗;如果存在多個鏈接的事務,那么您也會看到它們失敗。

確保無論如何都調用scope.Complete。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM