In dem von Ihnen angegebenen Codebeispiel wird bei allen Lesevorgängen dieser Zeile der alte Wert angezeigt, bis diese Transaktion festgeschrieben wird.
1) Betrachten Sie das Codebeispiel, das zweimal gleichzeitig mit demselben Wert von ausgeführt wird X
. Wenn Instanz A ausgeführt wurde select ... for update
, hat sie diese Zeile gesperrt, bis sie festgeschrieben wird. Instanz B blockiert auf diese Weise den Versuch, die Sperre auf die gleiche Weise zu aktivieren. Nur wenn A festschreibt, kann B fortfahren. B erhält dann den Wert A, der in seiner letzten Aktualisierung zurückgelassen wurde.
Wenn dies Y
davon abhängt, welchen Wert die select ... for update
Abfrage oder einen anderen Lesevorgang im 'komplexen' Teil gelesen hat, hat dies den gleichen Effekt, als ob sie seriell ausgeführt würden - Sie erhalten nicht die Race-Bedingung, unter der eines der Ergebnisse angezeigt wird verworfen.
Wenn dies Y
nur das Ergebnis der komplexen Abfragen in der Mitte ist, wird es parallel ausgeführt, ohne select ... for update
dass beide das gleiche Update durchführen.
2) for share
ermöglicht es anderen Auswahlen in dieser Zeile, fortzufahren, bewirkt jedoch, dass alles andere versucht select ... for update
oder update ...
blockiert wird, bis dies erledigt ist. Wenn der Beispielcode zweimal ausgeführt wurde, gleichzeitig würden sie Deadlock die bei Erreichen update
Aussage, so dass einer von ihnen abgebrochen werden.
3) Nein. Dies zu tun ist gefährlich, da ein Leser ein halb aktualisiertes Feld lesen könnte. (Oder lesen Sie den Rest eines Feldes, das nach dem Beginn des Lesens aktualisiert wurde.) Es kann auch die Konsistenz beeinträchtigen und dem Leser einen Wert anzeigen, der nach dem Start seiner Transaktion aktualisiert wurde.