2010-05-27 8 views
0

J'ai pensé les instructions SQL suivantes:insert exclusif de verrouillage

INSERT INTO A(a1, a2) 
SELECT b1, udf_SomeFunc(b1) 
FROM B 

Où udf_SomeFunc fait une sélection sur la table A. Si je comprends bien, tout d'abord, un verrou partagé est réglé sur A (je parle à peu près table A maintenant), puis, après la libération de ce verrou, un verrou exclusif est obtenu pour insérer les données. La question est: est-il possible qu'une autre transaction reçoive le verrou exclusif sur la table A, juste avant que la transaction en cours ne prenne sa place exclusive sur A?

Répondre

1

Food for thought

create table test(id int) 

insert test values(1) 
GO 

maintenant dans une fenêtre exécuter ce

begin tran 


insert into test 
select * from test with (holdlock, updlock) 
waitfor delay '00:00:30' 
commit 

tout ce qui est en cours d'exécution ouvert une autre connexion et faire

begin tran 

insert into test 
select * from test with (holdlock, updlock) 
commit 

que vous pouvez voir la deuxième l'insertion n'intervient que lorsque la première transaction est terminée

maintenant sortir les conseils de verrouillage et observer la différence