问题 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

3949
2017-11-02 04:50


起源



答案:


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

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

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

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


11
2017-11-02 05:38



如此处所示,它不会在连接期间更改它 - Martin Smith
@magicmike:谢谢!我接受它作为答案,但如果你能指出我的MS文档会更好。 - Schultz9999
如果它有帮助: SET TRANSACTION ISOLATION LEVEL  - msdn.microsoft.com/en-us/library/ms173763.aspx 隐含交易: - msdn.microsoft.com/en-us/library/ms188317.aspx - Code Magician
@magicmike:酷!谢谢! - Schultz9999


答案:


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

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

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

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


11
2017-11-02 05:38



如此处所示,它不会在连接期间更改它 - Martin Smith
@magicmike:谢谢!我接受它作为答案,但如果你能指出我的MS文档会更好。 - Schultz9999
如果它有帮助: SET TRANSACTION ISOLATION LEVEL  - msdn.microsoft.com/en-us/library/ms173763.aspx 隐含交易: - msdn.microsoft.com/en-us/library/ms188317.aspx - Code Magician
@magicmike:酷!谢谢! - Schultz9999