2013-12-12 19 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

是的,但那么使用交易有什么意义?事务用于绑定多个语句并在发生错误时进行回滚。 –

相关问题