Christian Seiler: MySQL 5.x : Update und Insert zusammenbinden?

Beitrag lesen

Hallo,

Bleibt jetzt noch eine Frage: Ist es auch erlaubt, _innerhalb_ einer stored routine eine Transaktion zu starten?

Prinzipiell schon.

Nachdem, was Du geschrieben hast, dürfte die dann nicht selber innerhalb einer Transaktion aufgerufen werden.

Du kannst das schon tun, allerdings führt das zweite BEGIN innerhalb der Procedure zu einem COMMIT der bisherigen Transaktion und startet dann eine neue Transaktion.

Ich würde das aber bleiben lassen - Transaktionshandling sollte immer innerhalb der Applikation und nie innerhalb von Stored Procedures erfolgen. Ausnahmen bestätigen die Regel.

Oder wäre es von der Sache her sowieso unsinnig, ein Mehrfachstatement so herum aufzubauen?

Multiple Statements zu einer Stored Procedure zusammenzufassen kann durchaus sinnvoll sein. Es hängt von der Aufgabenstellung ab.

Wie wirkt sich denn ein "Start Transaction - Commit" überhaupt auf die Nebenläufigkeits-Fähigkeit aus?

Laut MySQL-Doku werden nur die Zeilen gelockt, die bearbeitet werden - d.h. der Rest der Tabelle bleibt beschreibbar und lesbar ist sowieso immer alles. Ich hab's aber nicht ausprobiert.

Generell gesehen kann man aber sagen, dass eine Transaktion immer günstiger ist, als ein kompletter LOCK auf die Tabelle.

Kann es also sein, dass die Statement-Sequenz im eigenen virtuellen Scope noch sauber durchläuft und dann, aufgrund inzwischen geänderter Verhältnisse, erst beim Commit auf den Fehler (Kollision) läuft?

Prinzipiell gesehen: Ja. So wie ich die MySQL-Doku verstehe sollte das nicht geschehen (d.h. die einzelnen Statements sollten bereits fehlschlagen), aber ich kann mich zum einen auch täuschen und zum anderen ist es immer besser, man fängt so etwas von vorne herein ab.

Du solltest Dir übrigens auch SELECT ... FOR UPDATE ansehen, dann kannst Du, wenn Du bestimmte zusätzliche Daten erst auslesen musst bevor Du etwas modifizierst, der DB auch gleich sagen, dass Du das später noch modifizieren willst. Dann kann die DB nämlich sich bereits intern darauf einstellen, was dann dazu führt, dass Kollisionen vermindert werden (indem das andere SELECT ... FOR UPDATE das den gleichen Datensatz bearbeiten will z.B. auf die erste Transaktion warten muss bevor es ausgeführt wird, was dann zu keinem Fehler führt im Programm).

Viele Grüße,
Christian

--
Mein "Weblog" [RSS]
Using XSLT to create JSON output (Saxon-B 9.0 for Java)
»I don't believe you can call yourself a web developer until you've built an app that uses hyperlinks for deletion and have all your data deleted by a search bot.«
            -- Kommentar bei TDWTF