2011-10-31 128 views
0

我有一个关于如何在对同一个表执行批量插入时处理sql查询的问题。如何在执行批量插入时发出选择查询

我有一个ASP.NET Web应用程序,它创建了大量使用nHibernate以批处理方式插入表的对象(可能是50000)。即使使用Nhibernate优化,这也需要花费两分钟的时间。我在隔离级别设置为读取提交的数据库事务中执行此操作。

在批处理过程中,Web应用程序中的客户端必须能够读取此表中以前创建的数据。但是,他们不应该读取未被公开的数据。我的问题是,如果我在选择查询中使用隔离级别“读取已提交”,它们会超时,因为它们正在等待批量插入作业完成。

有没有办法以这种方式查询数据库,以便查询运行速度快并返回表中的所有提交行而无需等待批量插入作业完成?我不想返回任何未提交的数据。

我测试过将隔离级别设置为“快照”,这似乎解决了我的问题,但它是最好的方法吗?

问候异想天开

+0

您是否可以选择将批次拆分为几个较小的批次,以便它需要几秒钟而不是几分钟并独立提交? – 9000

+0

不幸的是,在这种情况下,它必须是全部或没有。 – whimsical82

回答

1

快照隔离返回前事务的开始就存在的数据,因此它不会阻止它不是做在桌子上的锁。它也忽略了其他锁定事务,所以在你的场景中,它听起来像是最适合你的。它的意思是,因为你的数据被插在一个批次,没有从该批次的数据将提供给SELECT语句,直到批量完成(即)

  • 时间1:数据集A存在于表
  • 时间2:批量开始将数据集B插入表(但不提交)。
  • 时间3:应用程序拍摄快照,并读取数据集A.
  • 时间4:应用程序完成反射数据集A(并且只有数据集A)。
  • 时间5:批量完成写入数据集B;数据集A和数据集B均为 ,均可在表中找到。
+0

谢谢。我将使用SNAPSHOT隔离级别! – whimsical82