2016-05-27 12 views
0

Documentation:LOCK IN SHARE MODE sperrt gesamte Tabelle

SELECT ... LOCK IN SHARE MODE setzt einen gemeinsamen Modus Sperre auf alle Zeilen, die zu lesen sind. Andere Sitzungen können die Zeilen lesen, aber sie können sie erst ändern, wenn Ihre Transaktion festgeschrieben wird. Wenn eine dieser Zeilen von einer anderen Transaktion geändert wurde, die noch nicht festgeschrieben wurde, wartet Ihre Abfrage bis zum Ende dieser Transaktion und verwendet dann die neuesten Werte.

Einige Experimente deuten jedoch darauf hin, dass es mehr als die gelesenen Zeilen sperrt.

CREATE TABLE example (a int); 
START TRANSACTION; 
SELECT a FROM example WHERE a = 0 LOCK IN SHARE MODE; 

Und dann auf eine andere Verbindung

INSERT INTO example VALUES (1); 

Die späteren Anschlussblöcke auf das Schloss.

Es scheint, dass LOCK IN SHARE MODE mehr als "alle Zeilen, die gelesen werden" sperrt.

Was genau funktioniert LOCK IN SHARE MODE sperren?

Antwort

2

Stellen Sie sicher, dass Sie einen Index für die Spalte a haben. Andernfalls, um WHERE a = 0 auszuwerten, muss es jede Zeile in der Tabelle lesen, und es wird dann eine Sperre für jede Zeile festlegen, wie es liest.

ALTER TABLE example ADD INDEX (a);