sql语句的事务隔离

sql语句的事务隔离,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我们可以在SQLServer2005/2008中为存储过程中的纯SQL语句设置隔离级别吗 案例1:(这样做很好) 案例2:(这种隔离材料在这里有效吗?) 如果案例2是正确的,那么它是否也适用于多个select语句?可以在会话级别使用会话选项设置隔离级别,也可以在查询级别使用表提示设置隔离级别。要设置整个会话的隔离级别,请使用以下命令: SET TRANSACTION ISOLATION LEVEL <isolation name>; 这里需要注意的一点是:如果隔离级别的名称由多个单

我们可以在SQLServer2005/2008中为存储过程中的纯SQL语句设置隔离级别吗

案例1:(这样做很好)

案例2:(这种隔离材料在这里有效吗?)


如果案例2是正确的,那么它是否也适用于多个select语句?

可以在会话级别使用会话选项设置隔离级别,也可以在查询级别使用表提示设置隔离级别。要设置整个会话的隔离级别,请使用以下命令:

SET TRANSACTION ISOLATION LEVEL <isolation name>;

这里需要注意的一点是:如果隔离级别的名称由多个单词组成,例如
REPEATABLE READ
,则使用session选项在单词之间指定一个空格。对于查询提示,我们不在单词之间指定空格,例如,
With(REPEATABLEREAD)。
是,它将适用于多个select语句


如果您担心在第二个存储过程中缺少事务,您应该知道查询是在隐式事务下执行的,而不是在第一个存储过程中执行显式事务。

如果在存储过程中使用
设置事务隔离级别
,此事务隔离级别用于存储过程的持续时间。根据:

如果在存储过程或触发器中发出SET TRANSACTION ISOLATION LEVEL,则当对象返回control时,隔离级别将重置为调用该对象时有效的级别

设置事务隔离级别与启动事务不同。事务隔离级别告诉SQL Server如何控制锁定

如果您只有多个具有读取未提交事务隔离级别的SELECT查询,那么将它们全部放在一个事务中并没有实际意义

CREATE PROCEDURE MySP 
AS 
BEGIN
   SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

   SELECT * FROM MyTable
END
SET TRANSACTION ISOLATION LEVEL <isolation name>;
SELECT ... FROM <table> WITH (<isolationname>);
SELECT *
FROM MyTable WITH (READCOMMITTEDLOCK);