如果之后BEGIN我已经SET TRANSACTION ISOLATION LEVEL ...声明,将在力给定的事务级存储过程的整个范围,无论我是否使用BEGIN TRANSACTION或不?也就是说,如果我有一些简单的SELECT语句,这些语句按照定义是原子的/事务处理的,它们的默认事务级别将设置为给定的吗?
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
首先,SQL Server中的默认隔离级别为Read Committed,因此该语句实际上不会做任何事情,除非您更改了默认隔离级别。
但是,总的来说,是的,SET事务隔离级别将更改整个过程的隔离级别(实际上是连接的持续时间)
请记住,所有SQL语句都是隐式事务,这意味着,例如,如果某个更新未能通过99%,它将自动回滚;否则,它将自动回滚。没有BEGIN TRAN/COMMIT必要。
BEGIN TRAN/COMMIT
要回答您的问题,是的,除非您用查询提示覆盖行为,否则SELECT语句将继承您设置的隔离级别(如果未设置,则为默认值),例如WITH NOLOCK,它将使单个查询的行为像您所做的那样SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
WITH NOLOCK
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED