如何在执行批量插入时发出选择查询

时间:2011-10-31 17:43:44

标签: sql sql-server batch-file

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

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

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

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

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

最好的问候异想天开

1 个答案:

答案 0 :(得分:1)

SNAPSHOT隔离返回事务开始之前存在的数据,并且它不会锁定表,因此它不会阻塞。它也忽略了其他锁定事务,因此在您的场景中,它听起来最适合您。它的意思是,由于您的数据是以批处理方式插入的,因此在批处理完成之前,SELECT语句中没有该批处理的数据可用(即)。

  • 时间1:数据集A存在于表
  • 时间2:批处理开始将数据集B插入表中(但不提交)。
  • 时间3:应用程序拍摄快照,并读入数据集A。
  • 时间4:应用程序完成数据集A的撤销(并且只有数据集A)。
  • 时间5:批处理完成写入数据集B;数据集A和数据集B是 两者均可在表格中找到。