2013-12-12 43 views
0

我的代碼試圖執行以下操作並導致鎖定問題,因爲它試圖提交的事務是針對大量數據項的。如何最好地使用NHibernate的BeginTransaction是一個循環?

 using(var session = sManager.OpenSession()) 
     { 
      using (var trans = session.BeginTransaction()) 
      { 
       var rows = 0; 
       foreach (var idsChunk in total.Chunk(500)) 
       { 
        .... <Execute Update> 
       } 

       trans.Commit(); 
      } 
     } 

大約有500K條記錄,上面的代碼鎖定了底層表的大部分時間。想知道在BeginTransation之外移動foreach是否會導致其他問題? 你能否建議適當的方式來使用這個?

+0

您是否嘗試過試驗NHibernate的配料和FlushMode選項? –

回答

0

那麼,這取決於爲什麼你正在使用的交易。如果整批應該失敗,那麼除了重新設計使用批量更新而不是使用NHibernate的記錄(會減少表被鎖定的時間)之外,您可以做的不多。如果一個插入可以失敗而不失敗整個批次,然後是把交易內循環(並捕獲任何例外)

+0

循環中的單個執行語句可能會失敗,而不會影響任何其他語句。但是,我在這裏尋找兩個答案; 1.在for循環中提交太多的事務可能會導致任何問題(在我的情況下會有大約1000個)。換句話說,是否建議使用盡可能低的交易? 2.我可以使用一個會話和多個交易 – user3096175

+0

如下面的情況: 使用(var session = sManager.OpenSession()) {var rows = 0; 的foreach(在total.Chunk VAR idsChunk(500)) {使用(VAR反式= session.BeginTransaction()){ .... <執行更新> } trans.Commit(); } } – user3096175

+0

是的,但那麼使用交易有什麼意義?事務用於綁定多個語句並在發生錯誤時進行回滾。 –

相關問題