2015-01-28 10 views
12

Ich war ein wenig überrascht zu entdecken, dass DDL-Anweisungen (alter table, create index etc) implizit die aktuelle Transaktion in MySQL committieren. Von MS SQL Server stammend, war die Möglichkeit, Datenbankänderungen in einer Transaktion lokal durchzuführen (die dann rückgängig gemacht wurde), ein wichtiger Teil meines Arbeitsablaufs. Bei der kontinuierlichen Integration wurde der Rollback verwendet, wenn die Migration aus irgendeinem Grund fehlschlug, so dass zumindest die Datenbank nicht in einem halb migrierten Zustand belassen wurde.Transactional DDL Workflow für MySQL

Wie lösen die Menschen diese beiden Probleme bei der Verwendung von MySQL mit Migrationen und fortlaufender Integration?

+2

Kreuz posted on DBA: http://dba.stackexchange.com/q/90794/18273 – sennett

+2

Willkommen in der wunderbaren Welt von MySQL :) –

+0

Sind Sie sicher, dass der SQL Server DDL-Befehl die Transaktion nicht festschreibt? weil im OLCL-Befehl auch die Transaktion festgeschrieben wird. –

Antwort

1

DDL-Anweisungen verursachen eine implizite Festschreibung, und Sie können nichts dagegen tun. Es gibt keine Möglichkeit, dieses Verhalten zu stoppen.

Welche DDL-Anweisungen dieses Verhalten haben, ändert sich im Laufe der Zeit, sodass Sie nach Ihrer Version suchen müssen.

5.1 http://dev.mysql.com/doc/refman/5.1/en/implicit-commit.html 
5.5 http://dev.mysql.com/doc/refman/5.5/en/implicit-commit.html 
5.6 http://dev.mysql.com/doc/refman/5.6/en/implicit-commit.html 

Wenn wir das Schema nur erweitern, neue Tabellen/Spalten/views/Procs/etc, die vorhandenen Code dann nicht beeinflusst Automatisierung ist in Ordnung, nur auf Fehler überprüfen und diese beheben.

Wenn sie den vorhandenen Code beeinflussen, müssen Sie von Fall zu Fall eine Strategie entwickeln. Da es kein Rollback gibt, benötigen Sie einen eigenen Backout-Plan, den Sie gründlich testen müssen.

Da es von Fall zu Fall nicht viel gibt, kann ich Ihnen Hilfe für Ihre spezielle Situation anbieten.

1

Eine Möglichkeit ist dabei DDL-Änderungen in einer nicht-destruktiven Weise, die Folgendes umfassen würde:

  • Split-Logik in DDL/DCL (+1 alle umkehren) und DML
  • läuft nur die DDL/DCL-Skript Spalten hinzufügen, neue Tabellen, ..
  • auf Ergebnis je:
    • auf Erfolg, die DML Änderungen zu übernehmen,
    • auf scheitern, gilt Reverse DDL/DCL-Skript, das Zeug zu entfernen Sie wan ted in zweiten Schritt hinzufügen (natürlich mit einigen Fehlern „existiert nicht“, je nachdem, wie weit Schritt 1 bekam)
  • entfernen, was nicht mehr, fallen alte Spalten/Tabellen
benötigt wird