我有一个关于如何在对同一个表执行批量插入时对表执行sql查询的问题。
我有一个ASP.NET Web应用程序,它创建了许多对象(可能是50000),这些对象使用nHibernate以批处理的方式插入到表中。即使采用Nhibernate优化,这也需要两分钟。我在数据库事务中执行此操作,隔离级别设置为read commited。
在批处理插入期间,Web应用程序中的客户端必须能够读取此表中以前创建的数据。但是,它们不应该能够读取未提交的数据。我的问题是,如果我在select查询上使用隔离级别“read committed”,他们会超时,因为他们正在等待批量插入作业完成。
有没有办法以这种方式查询数据库,以便查询快速运行并返回表中的所有已提交的行,而无需等待批量插入作业完成?我不想返回任何未提交的数据。
我已经测试过将隔离级别设置为“快照”,这似乎解决了我的问题,但这是最好的方法吗?
最好的问候异想天开
答案 0 :(得分:1)
SNAPSHOT隔离返回事务开始之前存在的数据,并且它不会锁定表,因此它不会阻塞。它也忽略了其他锁定事务,因此在您的场景中,它听起来最适合您。它的意思是,由于您的数据是以批处理方式插入的,因此在批处理完成之前,SELECT语句中没有该批处理的数据可用(即)。