我的一个客户端会话从事务中在表中创建一个条目,并继续其处理。事务在隔离模式read committed
下运行。同时,另一个客户端会话报告表中的所有数据。
由于锁定行(由其他客户端插入),全选操作现在完全锁定。
如何在全选过程中检索提交的数据,而不是完全锁定?
如有任何帮助,我们将不胜感激。
您对您的使用场景并不是很具体,但可以从表中获取数据,只有一些严重的警告。
正如marc_s所说,您可以使用READ UNCOMMITTED
快照隔离级别,这与在事务中的所有select语句上使用WITH (NOLOCK)
具有相同的效果。如果您只想读取该表,但正常处理事务中的所有其他读取,那么最好将NOLOCK
提示放在查询中的特定表上。例如:
SELECT *
FROM firstTable f INNER JOIN
secondTable s WITH (NOLOCK) on f.Key = s.Key
这将为firstTable
发出正常的读取锁定,但读取不带锁定的secondTable
。没有锁可能非常危险,因为你可以有效地取出损坏的数据。如果正在执行的插入重新排序数据并导致页面拆分,则可以两次取出同一行,并产生各种类似的不愉快。
因此,这是可能的,但并不理想,您应该警惕这种影响。这里有一些很好的进一步阅读,由Jason Strate提供。