0

我的一个客户端会话从事务中创建表中的条目并继续其处理。事务在隔离模式下运行read committed。同时,另一个客户端会话报告表中的所有数据。

由于锁定的行(由其他客户端插入),选择所有操作现在完全锁定。

如何在全选期间检索提交的数据,而不是完全锁定?

任何帮助将不胜感激。

4

1 回答 1

0

您并没有真正非常具体地了解您的使用场景,但是可以从表中获取数据,只是有一些严重的警告

正如 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 提供。

于 2012-07-10T16:12:42.540 回答