SQL Server:如何为整个存储过程设置默认隔离级别?

时间:2011-11-02 04:50:55

标签: sql sql-server tsql

如果在BEGIN SET TRANSACTION ISOLATION LEVEL ...语句之后,对于整个存储过程范围,给定的事务级别是否有效,无论我是否使用BEGIN TRANSACTION?也就是说,如果我有简单的SELECT语句,它们是按定义原子/事务处理的,那么它们的默认事务级别是否会设置为给定的语句?

BEGIN
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
 -- will a transaction level for a atomic transaction created by SQL Server for this statement be READ COMMITTED 
SELECT * FROM T
END

1 个答案:

答案 0 :(得分:11)

首先,SQL Server中的默认隔离级别是Read Committed,因此除非您更改了默认隔离级别,否则该语句实际上不会执行任何操作。

但是,通常,是的,SET事务隔离级别将改变整个过程的隔离级别(实际上是连接的持续时间)

请记住,所有SQL语句都是隐式事务,这意味着,例如,如果更新失败99%,它将自动回滚;不需要BEGIN TRAN/COMMIT

要回答您的问题,是的,您的SELECT语句将继承您设置的隔离级别(如果您未设置隔离级别,则为默认值),除非您使用WITH NOLOCK之类的查询提示覆盖行为,这将使单个查询的行为就像您SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

一样