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