簡體   English   中英

SQL Server 2014 In-Memory上一個事務中止異常

[英]SQL Server 2014 In-Memory previous transaction aborted exception

我正在開展一個目前正在生產的大型項目。 我們有一個很大的流程,最近改為使用SQL 2014 In-Memory Tables來提高性能。

該過程使用:

  • 51內存中的SQL表。
  • 50個存儲過程,從大約150個常規SQL表加載數據(Insert)。
  • 300個驗證(短存儲過程)從那些50個內存表中選擇(並插入到內存表中,如果存在則保存驗證錯誤)。

我們從ADO.Net調用此進程,首先加載存儲過程然后驗證,每個SP使用不同的SQL Connection 在正常使用中,一切正常,大約需要1.5秒。

在壓力測試(6個客戶X 100任務)下30分鍾。 幾分鍾后,我們開始得到這個SQL Exception (每20個任務有1個SQL異常):

A previous transaction that the current transaction took a dependency on has aborted, 
and the current transaction can no longer commit.

內存優化表中的事務

例外情況尚不清楚。 我們在此過程中未使用BEGIN TRANSACTION 每次都會在不同的存儲過程中發生SQL Exception

經過幾天的調查,我們陷入困境,我們不再有任何想法。 請求您幫助解決導致此異常的原因以及如何處理此異常。

沒有足夠的信息來真正追查問題,但我們可以嘗試解釋該錯誤的含義以及可能發生的方式來幫助您。

首先,正如您可能已經知道的那樣,當內存優化表(MOT)參與事務時,一種樂觀的並發控制,避免任何鎖定和阻塞等待鎖定。 相反,當檢測到某種並發沖突時,其中一個沖突的事務將注定失敗並將被回滾。

MOT的每一行都分配了幾個時間戳,這些時間戳定義了事務是否可以看到該行。

對於訪問MOT的事務,在提交之前執行特殊驗證階段。 因此,整個事務包括三個階段 - 常規,驗證和提交。

在常規階段,對事務所做的表的寫入對其他事務是不可見的,除了對其他刪除和更新可見的刪除和更新,並且如果一個事務與另一個事務寫入相同的行,則發生寫 - 寫沖突並且一個事務是立即注定要失敗。

現在最有趣的問題是驗證階段。 在這里,事務驗證違反了REPEATABLE READ或SERIALIZED隔離級別的內容。 假設事務在REPEATABLE READ下運行,在事務開始時讀取一行,並且在驗證階段它看到同一行由另一個事務更新(請記住,除非您寫入同一行,否則其他事務的寫入不可見,但是在這里你只是閱讀)。 交易在這里注定要失敗並將被回滾。

現在,重要的是當驗證階段開始時,此事務所做的寫入(讓我們將其命名為事務A,處於驗證階段)對另一個事務是可見的。 但請注意,他們尚未提交。 如果另一個事務(B)讀取這樣的數據(由現在處於驗證階段但尚未提交的事務編寫),它將獲得對A的依賴。這意味着A應該被提交,並且只有在提交了B之后才能提交。 如果由於某種原因,事務A在驗證階段失敗,事務B也將注定失敗,除了你的問題。

現在請記住,即使您沒有明確地開始事務,也會在事務內部執行每個語句。 您可能認為簡單的語句不會導致這樣的問題,但是像MERGE這樣的語句在內部可能會執行多個讀寫操作,並且它們將在事務內部執行。

您的錯誤可能發生的一個示例(這只是為了給您一些想法):

  1. 語句A在某些表上執行MERGE語句
  2. 它進入驗證階段。
  3. 語句B執行MERGE並讀取由A寫的一些數據。
  4. 我們在SERIALIZABLE隔離級別下運行,並且在驗證階段A注意到其他語句C插入了幻像行。違反了SERIALIZABLE級別並且將回滾A。
  5. B依賴於A,並且在您的例外情況下也會回滾。

希望這些信息能幫助您找到問題的根源。

您還可以通過將隔離級別設置為SNAPSHOT來跟蹤問題。 然后根據我的理解不執行驗證步驟,此錯誤不應再出現。

由於In-Memory表創建COMMIT DEPENDENCIES,您可能會遇到這種情況。

換句話說,經過一段時間並且在壓力測試之后,正常情況下您的數據庫會更加繁忙並在驗證階段和COMMIT階段中產生一些瓶頸。 因此,您可以通過以前的過程訪問不常見的記錄:錯誤41301(“當前事務工具依賴項已中止的先前事務...”)

您可以在事務之間強制執行COMMIT,主要是在啟動將使用該事務數據的新過程之前。 在某些情況下,簡單的“選擇計數(*)”可能會強制提交。

暫無
暫無

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

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