Jun*_*ior 5 sql sql-server transactions database-deadlocks locks
我相信SELECTSQL Server 中的每个语句都会导致放置共享锁或密钥锁.但它会在交易中放置相同类型的锁吗?共享锁或密钥锁是否允许其他进程读取相同的记录?
例如,我有以下逻辑
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;
Run Code Online (Sandbox Code Playgroud)
此时我的select语句仍会创建共享锁或密钥锁,还是会升级为独占锁?其他事务是否能够从table1读取记录,还是所有事务都会等到我的事务被提交,然后其他事务才能从中进行选择?
在一个应用程序中它是否因为将select语句移到事务之外而只是将插入/更新保留在一个事务中?
A SELECT将始终放置共享锁 - 除非您使用WITH (NOLOCK)提示(然后不会放置锁),使用READ UNCOMMITTED事务隔离级别(相同的事情),或者除非您使用WITH (XLOCK)或等查询提示专门覆盖它WITH (UPDLOCK).
共享锁允许其他读取进程也获取共享锁并读取数据 - 但它们阻止获取独占锁(用于插入,删除,更新操作).
在这种情况下,有选择的只是三排,将有没有锁升级(仅当正在由一个单一的交易收购了超过5000个锁发生).
根据事务隔离级别,这些共享锁将保持不同的次数.使用READ COMMITTED默认级别,锁定在读取数据后立即释放,而使用REPEATABLE READ或者SERIALIZABLE级别,锁定将保持,直到提交或回滚事务.