我相信SQL Server中的每个SELECT
语句都会导致放置共享锁或键锁。但是它会在事务中放置相同类型的锁吗?共享锁还是锁可以让其他进程读取相同的记录?在SQL 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语句仍创建共享或钥匙锁还是会得到升级到排它锁?其他事务是否能够从表1中读取记录,或者是否所有事务都会等到我的事务被提交,然后其他人才能从中进行选择?
在一个应用程序中,它是否会将select语句移到事务之外,并在一个事务中保持插入/更新?
非常感谢您提供这些有价值的信息。所以如果SQL Server对任何select语句默认使用“Read Committed”。之后没有试图将我的SELECT查询分开在事务 –
@MikeA之外:不,没有任何区别 - 共享锁将会被非常短暂地获取,以便实际读取数据(仅用于防止另一个进程在读取它们时更改它们),然后再次发布它们 - 在该事务内部或外部 - 同一过程 –
如果您不知道这一点:READ COMMITTED选择不会始终锁定。锁仅在未提交更改的页面上执行。您可以读取RC下的一个表,该表已由另一个事务处理为XLOCK,TABLOCK。 (我试过。) – usr