我有一堆实用程序,它们只是检查数据库中的某些条件并返回一个标志结果。这些过程以 READ UNCOMMITTED 隔离级别运行,相当于 WITH NOLOCK。
我还有更复杂的过程,它们以 SERIALIZABLE 隔离级别运行。他们也碰巧有这些相同的支票。
所以我决定从那些复杂的过程中调用这些检查过程,而不是复制检查代码。
基本上它看起来像这样:
CREATE PROCEDURE [dbo].[CheckSomething]
AS
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
BEGIN TRANSACTION
-- Do checks
COMMIT TRANSACTION
和
CREATE PROCEDURE [dbo].[DoSomethingImportant]
AS
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRANSACTION
EXECUTE [dbo].[CheckSomething]
-- Do some work
COMMIT TRANSACTION
这样做可以吗?临时激活的较低隔离级别会以某种方式破坏较高级别的保护,还是一切都完美安全?
编辑:执行顺利,没有任何错误。