我相信Server中的每个SELECT语句都会导致放置共享锁或密钥锁。但是,当它在事务中时,它会放置相同类型的锁吗?共享锁或密钥锁是否允许其他进程读取相同的记录?
例如,我有以下逻辑
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保留在一个事务中?
发布于 2016-02-29 21:57:52
SELECT将始终放置共享锁-除非您使用WITH (NOLOCK)提示(然后不会放置锁)、使用READ UNCOMMITTED事务隔离级别(同样的事情),或者除非您特别使用WITH (XLOCK)或WITH (UPDLOCK)之类的查询提示来覆盖它。
共享锁允许其他读取进程也获取共享锁并读取数据--但它们阻止获取独占锁(用于插入、删除、更新操作)。
在这种情况下,只要选择三行,就不会出现--没有锁升级(只有在单个事务获取了超过5,000个锁时才会发生这种情况)。
根据事务隔离级别的不同,这些共享锁将保持不同的时间。对于默认级别READ COMMITTED,在读取数据之后立即释放锁,而对于REPEATABLE READ或SERIALIZABLE级别,锁将一直保持到事务提交或回滚为止。
https://stackoverflow.com/questions/35710205
复制相似问题