Sch*_*999 11 sql t-sql sql-server
如果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
Run Code Online (Sandbox Code Playgroud)
Cod*_*ian 11
首先,SQL Server中的默认隔离级别是Read Committed,因此除非您更改了默认隔离级别,否则该语句实际上不会执行任何操作.
但是,通常,是的,SET事务隔离级别将改变整个过程的隔离级别(实际上是连接的持续时间)
请记住,所有SQL语句都是隐式事务,这意味着,例如,如果更新失败99%,它将自动回滚; 没有BEGIN TRAN/COMMIT必要.
要回答你的问题,是的,你的SELECT语句将继承你设置的隔离级别(或者如果你没有设置默认值,则为默认值),除非你用查询提示覆盖行为,这样WITH NOLOCK会使个别查询的行为就像你做的那样SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED