有时,我想运行存储过程来粗略估计两个或三个不同表中的记录数满足某些条件。如果在此估算期间添加,删除或更新新记录,则确实没有问题(我只是想粗略估计)。就是这样,我可以使用SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
来支付这个过程。但是,我有两个问题:
1)由于我只使用SELECT COUNT(*)
指令,我真的需要将这些语句包装在BEGIN/COMMIT TRANSACTION
块中吗?
2)我是否需要在存储过程的末尾SET TRANSACTION ISOLATION LEVEL READ COMMITTED
,或者在执行结束后自动设置?
答案 0 :(得分:0)
没有。读取不需要处于交易中
SET仅限于存储过程的范围。请在此处查看我的回答:Is it okay if from within one stored procedure I call another one that sets a lower transaction isolation level?。但是,您使用NOLOCK提示而不是SET:SELECT COUNT(*) FROM myTable WITH (NOLOCK)
。
如果您想要没有WHERE过滤器的近似计数,请使用sys.dm_db_partition_stats。请在此处查看我的回答:Fastest way to count exact number of rows in a very large table?
答案 1 :(得分:0)
1)否。如果未指定事务范围,则对每个语句使用隐式事务。您不必将显式事务范围设置为使“设置事务隔离级别起作用”。
2)您不必将其重置为原始版本。它将由SQL Server负责。请参阅此SO条目:Transaction Isolation Level Scopes