将 READ UNCOMMIT 与 UNION ALL 一起使用



我有一个正在开发的存储过程,有多个UNION ALL语句。 这是历史数据,我被指示使用SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED. 撇开关于这是否是正确的方法的讨论不谈,我想知道我是否需要在存储过程的顶部只指定一次此隔离级别,或者我是否需要在每个 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 退出时,隔离级别将恢复到以前的级别。

如果在存储过程中发出"设置事务隔离级别"或 触发器,当对象返回控制时,隔离级别被重置 到调用对象时生效的级别。例如,如果 您在批处理中设置可重复读取,然后批处理调用存储的 将隔离级别设置为"可序列化"的过程,即隔离 当存储过程时,级别设置将恢复为可重复读取 将控制权返回到批处理。

对历史数据使用"读取未提交"隔离级别可能没有风险。我认为指示您使用隔离级别的人知道风险并确定它是安全的。

历史数据通常要么根本不更改,要么以已知的时间间隔更改。(比如说,每季度一次。或每天凌晨 1:00。我希望相对较少的人对这些表具有插入权限,几乎没有人具有更新和删除权限。

您还可以测试在单个事务中运行三个单独的插入语句,而不是插入三个选择语句的联合。ORDER BY 子句在生产中可能是一个坏主意。

最新更新