可重复读和无锁

bla*_*kmk 5 sql-server nolock

有谁知道具有事务隔离级别为可重复读取的 t-sql 块的净效果,然后在内部使用 nolock 进行选择。

nolock 是否因为已经设置了隔离级别而变得无效?

Jon*_*gel 2

正如我所期望的,查询中的表提示优先。

这是我的测试脚本:

CREATE TABLE t1 (a int);

INSERT INTO t1(a) SELECT TOP 1000 message_id FROM sys.messages;


SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;

BEGIN TRANSACTION;

    SELECT * FROM t1 WITH(NOLOCK); /* Try it with and without the hint */

    EXEC sp_lock;

ROLLBACK;
Run Code Online (Sandbox Code Playgroud)

包含NOLOCK提示后,该语句不会获取任何锁SELECT

换句话说,在事务上设置隔离级别会使该隔离级别成为事务中的默认值,但该默认值仍然可以被表提示覆盖,正如我所演示的那样。