我有一个正在开发中的存储过程,带有多个UNION ALL
语句。这是历史数据,已指示我使用SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
。暂时不讨论这是否是正确的方法,我想知道是否只需要在存储过程的顶部指定一次此ISOLATION LEVEL,或者是否需要在每个UNION ALL之后都指定它,因为它们是不同的查询吗?
例子:
Alter procedure dbo.ExampleProcedure as
declare @StartDate datetime
declare @EndDate datetime
insert into myDB.DBO.InboundCalls
select I.Date, I.System, Count(*) as calls
from
(select Date, System, CallID from System1CallData C
Left Join someothertables as S on C.CallID = S.CallID
where (C.date >= @StartDate and C.date < @EndDate)) as I
Group by I.Date, I.System
Union ALL
select I.Date, I.System, Count(*) as calls
from
(select Date, System, CallID from System2CallData C
Left Join someothertables as S on C.CallID = S.CallID
where (C.date >= @StartDate and C.date < @EndDate)) as I
group by I.Date, I.System
Union ALL
select I.Date, I.System, Count(*) as calls
from
(select Date, System, CallID from System3CallData C
Left Join someothertables as S on C.CallID = S.CallID
where (C.date >= @StartDate and C.date < @EndDate)) as I
Group by I.Date, I.System
Order by I.Date asc, I.System asc, calls asc
那么我应该在每个嵌套SET TRANSACTION ISOLATION LEVEL
之后Alter Procedure dbo.ExampleProcedure as
还是之前?在此先感谢您的指导!SELECT
SELECT
我想知道是否只需要在存储过程的顶部指定一次此隔离级别。。。
在此过程的顶部仅执行一次,除非您当然要在该过程中切换隔离级别。该隔离级别恢复到以前的水平,当SP退出。
如果在存储过程或触发器中发出SET TRANSACTION ISOLATION LEVEL,则当对象返回控件时,隔离级别将重置为调用对象时有效的级别。例如,如果您在批次中设置了REPEATABLE READ,然后该批次调用了将隔离级别设置为SERIALIZABLE的存储过程,则当存储过程将控制权返回给该批次时,隔离级别设置将恢复为REPEATABLE READ。
使用“未提交读”隔离级别可能对历史数据没有风险。我假设指示您使用该隔离级别的人员知道风险,并确定它是安全的。
历史数据通常要么根本不改变,要么以已知间隔改变。(例如,每季度。或者每天凌晨1:00。)我希望相对较少的人在这些表上具有插入特权,而几乎没有人具有更新和删除特权。
您可能还会测试在单个事务中运行三个单独的插入语句,而不是插入三个选择语句的并集。ORDER BY子句在生产中可能不是一个好主意。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句