Ja - bis zu einem gewissen Grad.
Wie lange ein SELECT
hält eine gemeinsame Sperre, hängt von der Isolationsstufe der Transaktion ab:
READ UNCOMMITTED
- es wird überhaupt keine gemeinsame Sperre erworben -UPDATE
ist nicht gesperrtREAD COMMITTED
- Shared Lock wird nur für die Dauer des Lesens der Daten erworben -UPDATE
kann für einen sehr kurzen Zeitraum gesperrt werdenREPEATABLE READ
undSERIALIZABLE
- Shared Lock wird erworben und bis zum Ende der Transaktion gehalten -UPDATE
ist bis zumSELECT
gesperrt Transaktion endet
Technisch gesehen ist das UPDATE
-Anweisung erhält zuerst ein UPDATE
Sperre - die mit einer gemeinsamen Sperre kompatibel ist (wie sie von SELECT
verwendet wird ) - für die Dauer des Lesens der aktuellen Werte der zu aktualisierenden Zeilen.
Sobald das erledigt ist, das Update
Die Sperre wird zu einer exklusiven Sperre eskaliert, damit die neuen Daten in die Tabelle geschrieben werden.