Avoir la table, définie par le script [1], j'exécuter des scripts dans 2 fenêtres de SSMSPourquoi UPDATE bloque SELECT sur des lignes non liées?
--1) first in first SSMS window
set transaction isolation level READ UNCOMMITTED;
begin transaction;
update aaa set Name ='bbb'
where id=1;
-- results in "(1 row(s) affected)"
--rollback
et après 1)
--2)after launching 1)
select * from aaa --deleted comments
where id<>1
--is blocked
Indépendamment du niveau d'isolation des transactions en 1) la fenêtre, la SELECT in 2) est bloqué.
Pourquoi?
Le niveau d'isolement de UPDATE a-t-il une influence sur les instructions d'autres transactions?
Le niveau d'isolation le plus élevé est par défaut READ COMMITTED in 2).
Aucun verrou de plage n'est attribué, SELECT doit avoir souffert de problèmes COMMITTED READS (lecture non répétable) et PHANTOM READS (lectures répétables) [2]
Comment le faire souffrir?
Comment faire UPDATE sans bloquer SELECT?
[1]
CREATE TABLE aaa
(
Id int IDENTITY(1,1) NOT NULL,
Name varchar(13) NOT NULL
)
insert into aaa(Name)
select '111' union all
select '222' union all
select '333' union all
select '444' union all
select '555' union all
select '666' union all
select '777' union all
select '888'
[2]
Copier & coller ou ajouter de fin) après avoir cliqué sur
http://en.wikipedia.org/wiki/Isolation_(database_systems)
Mise à jour:
SELECT AVEC (NOLOCK) n'est pas bloqué ..
Update2:
ou avec , ce qui est le même, LIRE NON CONVENU
Notez que UPDATE est différent de la ligne SELECT.
Même, si le même, ce comportement est en contradiction avec la description des niveaux d'isolement [2]
Les points sont les suivants:
- suppose que je ne peux pas savoir qui d'autre va SELECT de la même (MISE A JOUR -d) sur la table, mais sans rapport avec la mise à jour des lignes
- pour comprendre les niveaux d'isolement [2]
SQL Server 2008 R2 Dev
(sélectionnez avec NOLOCK) bloque? –
vouliez-vous dire "-" avec l'indice? –
Que faire si vous utilisez l'indice de mise à jour rowlock? (et en supposant qu'il ne soit pas escaladé ...) –