sql语句的事务隔离

时间:2014-04-22 12:10:55

标签: sql sql-server sql-server-2008

我们可以在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语句?

3 个答案:

答案 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查询,则将它们全部放入事务中将不会产生实际差异。