2011-06-08 74 views
1

我使用NHibernate的3.1.0與MySql連接器6.3.5。作爲一般規則,我的存儲庫方法被包裝在一個NHibernate事務中。然而,調用存儲庫方法的服務或應用程序代碼也可能需要一個事務範圍 - 因此NHibernate事務與.NET的TransactionScope混合在一起。一個模擬測試是這樣的:與NHibernate的BeginTransaction()問題使用TransactionScope()

[Test] 
public void CanPerformNestedSave() 
{ 
    using (var tx = new TransactionScope()) 
    { 
     var user = new AdminUser { Email = "[email protected]", Name = "Test User 1", Password = "123" }; 

     using (ISession session = OpenSession()) 
     { 
      using (var tx = session.BeginTransaction()) 
      { 
       entity.ModifiedAt = DateTime.Now; 
       session.SaveOrUpdate(entity); 
       tx.Commit(); 

       return entity; 
      } 
     } 

     tx.Complete(); 
    } 
} 

測試失敗,出現以下錯誤:

NHibernate.TransactionException:開始失敗,SQL例外 ----> System.InvalidOperationException:嵌套事務未支持的。

我已經搜遍網絡找到這個場景的解決方案,並希望社區在StackOverflow可以提供幫助。

+0

感謝Lulian(下)。最後,我決定實現我自己的工作單元模式,利用NHibernate session.BeginTransaction來管理它。 – Dion 2011-06-10 08:31:31

回答

1

我上傳了這個here

在博客文章NServiceBus爲處理程序創建外部TransactionScope,並在處理程序中使用Nhibernate會話和事務。

+0

感謝Lulian,我看過你的文章,但由於我沒有使用NServiceBus,我很難理解文章與我的問題的相關性。我有兩種不同的方法來啓動事務 - 一個來自NH,另一個來自.NET - 儘管他們應該一起玩,但他們似乎並不這樣。我剛剛得到一個_Nested事務不支持_錯誤。 – Dion 2011-06-08 14:04:45

+0

在NServiceBus的情況下,存在相同的問題,因爲它總是在TransactionScope上下文中執行處理程序。在處理程序中,您需要使用NH事務。所以基本上你有一個外部的TransactionScope和一個內部的ITransaction,並且MysqlConnector不支持開箱即用。 – 2011-06-08 15:08:33

+0

只是爲了澄清,文章建議修改mysql連接器。您可以在評論中找到更改的詳細信息 – 2011-06-08 15:12:58