Use*_*ser 3 sql-server stored-procedures transactions transaction-isolation
我有一堆实用程序只检查数据库中的某些条件并返回标志结果.这些过程使用READ UNCOMMITTED隔离级别运行,相当于WITH NOLOCK.
我还有更复杂的程序,使用SERIALIZABLE隔离级别运行.他们也恰好在其中进行了同样的检查.
所以我决定从这些复杂的程序中调用这些检查程序,而不是复制检查代码.
基本上它看起来像这样:
CREATE PROCEDURE [dbo].[CheckSomething]
AS
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
BEGIN TRANSACTION
-- Do checks
COMMIT TRANSACTION
Run Code Online (Sandbox Code Playgroud)
和
CREATE PROCEDURE [dbo].[DoSomethingImportant]
AS
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRANSACTION
EXECUTE [dbo].[CheckSomething]
-- Do some work
COMMIT TRANSACTION
Run Code Online (Sandbox Code Playgroud)
那样做可以吗?暂时激活的较低隔离级别会以某种方式破坏更高级别的保护还是一切都完全安全?
编辑:执行顺利,没有任何错误.
这就是SQL Server 2005 的全部内容.一个片段:
将事务从一个隔离级别更改为另一个隔离级别时,根据新级别的规则保护在更改后读取的资源.在更改之前读取的资源将继续根据上一级别的规则进行保护.例如,如果事务从READ COMMITTED更改为SERIALIZABLE,则更改后获取的共享锁现在保持到事务结束.
如果在存储过程或触发器中发出SET TRANSACTION ISOLATION LEVEL,则当对象返回控件时,隔离级别将重置为调用对象时生效的级别.例如,如果在批处理中设置REPEATABLE READ,然后批处理调用将隔离级别设置为SERIALIZABLE的存储过程,则当存储过程将控制权返回给批处理时,隔离级别设置将恢复为REPEATABLE READ.
在这个例子中: