如果在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
答案 0 :(得分:11)
首先,SQL Server中的默认隔离级别是Read Committed,因此除非您更改了默认隔离级别,否则该语句实际上不会执行任何操作。
但是,通常,是的,SET事务隔离级别将改变整个过程的隔离级别(实际上是连接的持续时间)
请记住,所有SQL语句都是隐式事务,这意味着,例如,如果更新失败99%,它将自动回滚;不需要BEGIN TRAN/COMMIT
。
要回答您的问题,是的,您的SELECT语句将继承您设置的隔离级别(如果您未设置隔离级别,则为默认值),除非您使用WITH NOLOCK
之类的查询提示覆盖行为,这将使单个查询的行为就像您SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED