SQL Locks
-
Hallo zusammen,
wir arbeiten zwar regelmäßig mit Datenbanken aber uns ist gerade mal aufgefallen dass wir gar nicht so genau wissen was intern passiert. Wir haben uns nämlich gerade folgende Frage gestellt:
Nehmen wir mal an wir haben eine Tabelle mit 20 Spalten und 10Millionen Datensätzen. Jetzt kommt einer daher und fragt mit einem SELECT alles aber. Dieser Vorgang dauert z.B. 10 Minuten. Nach 5 Minuten kommt ein anderer daher und macht ein Update auf eine Spalte bei Datensatz 7 Millionen. Was passiert dann? Bekommt das SELECT diese Änderung mit und wird das von jedem DBMS gleich gehandlet? SPrich Oracle, Firebird und MSSQL?
-
Es wird nicht von jedem DBMS gleich behandelt, und es ist sogar auf ein und dem selben DBMS meist abhängig vom sog. "Transaction Isolation Level".
Bei MSSQL Server und Transaction Isolation Level = "serializable" wird das UPDATE so lange warten müssen bis die lesende Transaktion abgeschlossen ist.
Wann genau die lesende Transaktion als abgeschlossen gilt ist dann wieder von einigen Faktoren abhängig - z.B. ob es eine explizite oder implizite Transaktion war, welcher Cursor-Typ für das SELECT verwendet wird etc.Bei MSSQL und "read committed" wird das UPDATE dagegen nicht verzögert, und so bald es committed ist scheint es im Result-Set des SELECT auch auf.
Bei MSSQL und "snapshot" wird das UPDATE auch nicht verzögert, die lesende Transaktion wird aber niemals die Daten sehen die das UPDATE geschrieben hat.
etc.
Zu anderen DBMS wie Oracle, Firebird, ... kann ich nicht viel sagen, da ich keine Erfahrung mit diesen habe.
ps: duch das Locking können im Übrigen auch Deadlocks entstehen. Das DBMS handelt das normalerweise so dass es den Deadlock irgendwann erkennt, und dann eine der beteiligten Transaktionen (normalerweise die deren Rollback billiger ist) auswählt und einfach mit einer entsprechenden Fehlermeldung abschiesst.
(Irgendwas ala "...has detected a deadlock and your transaction was chosen as the victim".)
-
I.R. muss man bei MySQL warten bis der Select fertig ist. Dann erst wird das Update durchgeführt.
Bedeutet aber auch das der Update-Client wartet und auch abbrechen kann.
-
Nekromant