我有一个正在开发的存储过程,包含多个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
?提前感谢任何指导!
答案 0 :(得分:2)
我想知道是否需要在存储过程的顶部指定一次ISOLATION LEVEL。 。
在程序的顶部只有一次,除非您在程序中切换隔离级别。 SP退出时isolation level reverts到上一级别。
如果您在存储过程中发出SET TRANSACTION ISOLATION LEVEL或 触发器,当对象返回控制时,隔离级别被重置 到调用对象时生效的级别。例如,如果 你批量设置REPEATABLE READ,然后批处理调用存储 将隔离级别设置为SERIALIZABLE,隔离的过程 级别设置在存储过程时恢复为REPEATABLE READ 将控制权交还给批次。
使用&#34;读取未提交的&#34;隔离级别可能对历史数据没有风险。我假设指示你使用隔离级别的人知道风险并确定它是安全的。
历史数据通常要么根本不变,要么以已知的间隔变化。 (比如,每季度。或者每天凌晨1点。)我预计相对较少的人对这些表具有插入权限,几乎没有人拥有更新和删除权限。
您还可以测试在单个事务中运行三个单独的insert语句,而不是插入三个select语句的并集。 ORDER BY子句在生产中可能是一个坏主意。