0

有时,我想运行一个存储过程来粗略估计两个或三个不同表中有多少记录满足某些条件。如果在此估计期间添加、删除或更新了新记录,则没有真正的问题(我只是想要一个粗略的估计)。也就是说,我可以负担得起使用SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED. 但是,我对此有两个问题:

1)由于我只使用SELECT COUNT(*)指令,我真的需要将这些语句包装在一个BEGIN/COMMIT TRANSACTION块中吗?

2)我需要在存储过程SET TRANSACTION ISOLATION LEVEL READ COMMITTED结束时返回,还是在执行结束后自动设置?

4

2 回答 2

0
  1. 不,读取不需要在事务中

  2. SET 仅适用于存储过程。在这里查看我的答案:如果在一个存储过程中我调用另一个设置较低事务隔离级别的存储过程,可以吗?. 但是,您将使用 NOLOCK 提示而不是 SET: SELECT COUNT(*) FROM myTable WITH (NOLOCK)

如果您想要一个没有 WHERE 过滤器的近似计数,请使用 sys.dm_db_partition_stats。在这里查看我的答案:在一个非常大的表中计算确切行数的最快方法?

于 2011-06-18T10:37:54.377 回答
0

1)不。如果您不指定事务范围,它将对每个语句使用隐式事务。您不必为使“设置事务隔离级别起作用”而明确的事务范围。

2)您不必将其重置为原始状态。它将由 SQL Server 处理。请参考这个 SO 条目:Transaction Isolation Level Scopes

于 2011-06-18T10:43:49.760 回答