首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL Server中事务中SELECT语句的锁定类型

SQL Server中事务中SELECT语句的锁定类型
EN

Stack Overflow用户
提问于 2016-02-29 21:40:06
回答 1查看 5.9K关注 0票数 6

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

例如,我有以下逻辑

代码语言:javascript
复制
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语句移动到事务之外,并将insert/update保留在一个事务中?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-29 21:57:52

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

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

在这种情况下,只要选择三行,就不会出现--没有锁升级(只有在单个事务获取了超过5,000个锁时才会发生这种情况)。

根据事务隔离级别的不同,这些共享锁将保持不同的时间。对于默认级别READ COMMITTED,在读取数据之后立即释放锁,而对于REPEATABLE READSERIALIZABLE级别,锁将一直保持到事务提交或回滚为止。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35710205

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档