2014-02-05 148 views
0

這段代碼可以使一些不好的事情?我在一個項目中發現它,並不知道它是否可能導致一些瘋狂的錯誤(死鎖,數據庫超時...)。這樣的代碼即使在線程中也可以在程序中多次執行。NHibernate新會話與現有交易中的交易

非常感謝

class first { 
    void doSomething { 
     using (ITransaction transaction = session.BeginTransaction){ 

      var foo = new second(); 
      foo.doInNewTransaction(); //inner transaction in new session 

      transaction.Commit(); 
      } 
    } 
} 

class second { 
    void doInNewTransaction(){ 
     using (Session session = new Session()){ 
      using (ITransaction transaction = session.BeginTransaction){ 

       //do someting in database 
       transaction.Commit(); 
      } 
     } 
    } 
} 
+0

你的代碼目前沒有做壞事,但你可以添加代碼。你不能用代碼構造來阻止'壞東西',只能通過開發者知道他們在做什麼。 – Peter

+0

當然,我需要知道這種做法是否總體上不好 - 我的意思是......在現有交易中打開新會話和交易 – Cicik

回答

0

這應該是罰款。我確信我過去做過這樣的事情。唯一需要注意的是,如果在內部會話中修改對象,那麼如果已經加載了相同的對象,則這些更改不會自動反映到外部會話中。

話雖如此,如果你不需要這樣做,那麼我會避免它。通常我會在使用NHibernate時推薦基於AOP的事務管理。這將允許您的內部組件輕鬆地加入外部組件的事務。但是,爲了做到這一點,您需要使用支持該功能的DI容器,例如Spring.NET或Castle。