我们可以在SQL Server 2005/2008的存储过程中为纯SQL语句设置隔离级别吗?
案例1 :(这样可以正常工作)
CREATE PROCEDURE MySP
AS
BEGIN
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
BEGIN TRAN
SELECT * FROM MyTable
COMMIT TRAN
END
案例2 :(这种隔离的东西在这里工作吗?)
CREATE PROCEDURE MySP
AS
BEGIN
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
SELECT * FROM MyTable
END
如果案例2是正确的,它是否也适用于几个select语句?
答案 0 :(得分:1)
是的,它适用于多个选择语句。
如果您担心第二个存储过程中的事务缺失,您应该知道查询是在隐式事务下执行的,而不是您在第一个存储过程中的显式事务。
答案 1 :(得分:0)
隔离级别可以在会话级别使用会话选项设置,也可以在查询级别使用表提示进行设置。要设置整个会话的隔离级别,我们使用命令:
SET TRANSACTION ISOLATION LEVEL <isolation name>;
您可以使用表提示将查询的隔离级别设置为:
SELECT ... FROM <table> WITH (<isolationname>);
所以在你的情况下就像是:
SELECT *
FROM MyTable WITH (READCOMMITTEDLOCK);
需要注意的一件事是:使用会话选项,如果隔离级别的名称由多个单词组成,例如REPEATABLE READ
,则在单词之间指定一个空格。使用查询提示,我们不会在单词之间指定空格 - 例如,WITH (REPEATABLEREAD).
答案 2 :(得分:0)
如果在存储过程中使用SET TRANSACTION ISOLATION LEVEL
,则此事务隔离级别将用于存储过程的持续时间。根据{{3}}:
如果在存储过程或触发器中发出SET TRANSACTION ISOLATION LEVEL,则当对象返回控件时,隔离级别将重置为调用对象时生效的级别。
设置事务隔离级别与启动事务不同。事务隔离级别告诉SQL Server如何控制锁定。
如果您只有多个具有READ UNCOMMITTED事务隔离级别的SELECT查询,则将它们全部放入事务中将不会产生实际差异。