繁体   English   中英

在SQL Server中的事务中为SELECT语句放置了什么类型的锁

[英]What kind of lock is placed for SELECT statement within a transaction in SQL Server

我相信SQL Server中的每个SELECT语句都会导致放置Shared或Key锁。 但它会在交易中放置相同类型的锁吗? 共享锁或密钥锁是否允许其他进程读取相同的记录?

例如,我有以下逻辑

Begin Trans
-- select data that is needed for the next 2 statements
SELECT * FROM table1 where id = 1000; -- Assuming this returns 10, 20, 30

insert data that was read from the first query
INSERT INTO table2 (a,b,c) VALUES(10, 20, 30);

-- update table 3 with data found in the first query
UPDATE table3
SET d = 10,
   e = 20,
   f = 30;

COMMIT;

此时我的select语句是否仍会创建共享锁或密钥锁,还是会升级为独占锁? 其他事务是否能够从table1读取记录,或者所有事务是否会等到我的事务被提交,然后其他事务才能从中进行选择?

在一个应用程序中它是否因为将select语句移到事务之外而只是将插入/更新保留在一个事务中?

SELECT将始终放置共享锁 - 除非您使用WITH (NOLOCK)提示(然后不会放置 ),使用READ UNCOMMITTED事务隔离级别(相同的事情),或者除非您使用像WITH (XLOCK)这样的查询提示专门覆盖它WITH (XLOCK)WITH (UPDLOCK)

共享锁允许其他读取进程也获取共享锁并读取数据 - 但它们阻止获取独占锁(用于插入,删除,更新操作)。

在这种情况下,有选择的只是三排,就没有锁升级(仅当正在由一个单一的交易收购了超过5000个锁发生)。

根据事务隔离级别 ,这些共享锁将保持不同的次数。 使用READ COMMITTED (默认级别),在读取数据后立即释放锁定,而使用REPEATABLE READSERIALIZABLE级别,锁定将保持到提交或回滚事务为止。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM