簡體   English   中英

EF6 transaction.Complete() 失敗給出“ROLLBACK TRANSACTION 請求沒有對應的 BEGIN TRANSACTION”

[英]EF6 transaction.Complete() fails giving "The ROLLBACK TRANSACTION request has no corresponding BEGIN TRANSACTION"

我繼承了一小段 ASP.NET C# 代碼,它使用 EF6 BulkInsert() 將大量記錄(通常為 1 到 1000 行)添加到 SQL 服務器表(只有幾個字段)。 它運行很多並且通常是成功的。 有時它會失敗,顯然是在成功插入記錄之后的 transaction.Complete() 調用中。

var _TransactionOption = new TransactionOptions
{
    IsolationLevel = System.Transactions.IsolationLevel.Serializable,
    Timeout = TimeSpan.FromSeconds(TRANSACTION_MAXSECONDS)
};

using (var _Trans = new TransactionScope(TransactionScopeOption.Required, _TransactionOption))
{
    _db.Configuration.AutoDetectChangesEnabled = UseAutoDetectChangesEnabled_;
    var options = new BulkInsertOptions
    {
        EnableStreaming = true,
        TimeOut = 120,
        SqlBulkCopyOptions = SqlBulkCopyOptions.TableLock
    };
    _db.BulkInsert(_Data.Values, options);
    ...// DEBUG HERE IS DISPLAYED WHEN THERE'S AN EXCEPTION...
    _Trans.Complete(); // THIS GENERATES THE EXCEPTION
} catch ... { ERROR REPORTED HERE }

它失敗並顯示“ ROLLBACK TRANSACTION 請求沒有對應的 BEGIN TRANSACTION ”。

我不明白什么是失敗的。 為什么 Complete() 會生成 ROLLBACK 錯誤,為什么 BulkInsert 沒有發生這種情況? 插入值的表沒有唯一索引或其他會產生異常的約束。

同樣讓我感到困惑的是,對於相同的數據,異常出現在 PROD 中,但它們沒有出現在 QA 中,這表明實體框架實現的某些部分沒有設置相同,但我看不出那是什么。

該代碼使用多個線程來執行這些插入,我懷疑這可能有所貢獻。

所以問題是 -為什么會失敗? 在沒有答案的情況下(似乎沒有人會知道),后續問題是——我可以添加什么日志記錄來發現原因?

這一切都在 Windows Server 2019 上。

--我嘗試過的其他事情-- 我添加了日志記錄以列出 _Data 中的值,以查看其中是否有任何內容會在數據庫端產生錯誤。 我添加了驗證以確保插入的字符串不大於它插入的字段,並且其他幾個字段對其目標有效。 我查看了 .NET 在 PROD 和 QA 上的安裝是否相同:這些服務器的配置似乎完全不同,但是服務器管理器->本地服務器->角色和功能->Web 服務器 (IIS)->Web中的組件Server->Application Development兩者看起來都一樣。

日志記錄沒有顯示異常原因。

我查看了討論此錯誤的其他 SO 條目,但它們並未在此處解決該問題。

多線程與Serializable隔離和 Table Lock 選項相結合可能會導致您的問題。 我建議刪除多線程,看看是否能解決您的問題。 如果它來自多個來源(例如:多個用戶會話),請使用某種排隊機制。 另外,您是否排除了Timeout屬性是否被命中?

Serializable隔離級別是最嚴格的選項,並且最容易發生阻塞和死鎖。 表鎖選項也會限制並發。 負載發生時是否有此表的任何讀者? 您可能希望將Serializable隔離級別更改為Read Committed (對並發性更寬容;默認為 SQL 服務器)並從選項中刪除TableLock 這些設置有利於非常大的批量插入的性能。 使用這些設置,您的典型數據量高達 1K 記錄不會有任何有意義的好處。

暫無
暫無

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

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