簡體   English   中英

具有未提交的第一個事務的TransactionScope在分布式事務上失敗

[英]TransactionScope with uncommited first transaction fails on distributed transaction

嘗試調試某些內容時,我發現有效執行以下操作的代碼:

  1. 創建一個TransactionScope
  2. 創建一個事務(在本例中為nHibernate tx,但不是很重要)
  3. 創建第二個事務(在本例中為標准ADO.Net Tx)
  4. 進行第二筆交易
  5. 在交易范圍內調用Complete()
  6. 處置交易范圍。

現在-無論如何創建事務而不提交都可能不是一個好主意-尤其是在擁有(並且是錯誤修復)的情況下。

但是,當進行測試時-我嘗試了以上各項的各種組合(提交所有事務,某些事務,沒有事務(即僅TScope)提交第一個事務,而不提交第二個事務,添加其他事務等),並且在所有情況下,我發現以下內容是真實的:

僅當我未能提交第一個事務並且事務范圍已分發時,TScope的處置才會失敗,並且:

System.InvalidOperationException:該操作對登記的當前狀態無效。

我現在很好奇,想知道為什么會這樣嗎?

我懷疑您看到的問題已被以下其中一項覆蓋: https : //nhibernate.jira.com/issues/?jql=project%20%3D%2010000%20AND%20labels%20%3D%20TransactionScope

我不完全確定會發生什么,但是我已經看到了類似的行為,例如,如果NH參與了環境事務,並且該事務后來變得分散了,則調用TransactionScope.Complete()可能會掛起20秒,然后失敗。

即使您不使用NH事務,NH也會嘗試加入TransactionScope。 在這種情況下,NH將在環境事務的Prepare()階段刷新更改。 它將在db連接上執行此操作,但是它也已加入事務,並且將獲得其自己的Prepare()調用。 不幸的是,我無法找出確切的問題,但是我懷疑會發生什么,在某些情況下,數據庫連接Prepare()將在NHibernate的Prepare()之前調用。 后者將嘗試繼續使用db連接,並且看來這會導致某種死鎖。

使用NH事務並在完成事務作用域之前提交此事務,將使NH在基礎數據庫連接進入准備階段之前清除其更改。

暫無
暫無

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

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