Ausführen mehrerer MySQL -Anweisungen in einer Transaktion im MyBatis -Migrationstool ausführen

StackOverflow https://stackoverflow.com/questions/5380201

  •  28-10-2019
  •  | 
  •  

Frage

Ich verwende das MyBatis -Migrationstool, um das Schema in unserer Datenbank zu verwalten, aber ich habe das folgende Problem.

Wenn wir in einer Migration mehrere Anweisungen verwenden, werden sie derzeit in einer separaten Transaktion ausgeführt. Wenn ich also 2 Tabellen (oder mehrere Aussagen ausführen) als Teil eines Merkmals ändern möchte und eine davon bricht, muss jeder, der zuerst ausgeführt wurde, manuell zurückgekehrt werden. Die MyBatis -Migration ist jedoch nur in der ChangeLog -Tabelle als vollständig markiert, wenn alle Aussagen erfolgreich abgeschlossen sind.

Dies ist wirklich frustrierend, da es keine Möglichkeit gibt, einen ständigen DB -Zustand aufrechtzuerhalten, wenn die gesamte Migration nicht autonom ist.

Einstellungen

Hier ist die (relevante) Einstellung für MyBatis MyGration für unsere Testdatenbank.

## JDBC connection properties.
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/gamealert_test?allowMultiQueries=true
username=gamealert
password=********

# If set to true, each statement is isolated
# in its own transaction.  Otherwise the entire
# script is executed in one transaction.
auto_commit=false

# This controls how statements are delimited.
# By default statements are delimited by an
# end of line semicolon.  Some databases may
# (e.g. MS SQL Server) may require a full line
# delimiter such as GO.
delimiter=;
full_line_delimiter=false

# This ignores the line delimiters and
# simply sends the entire script at once.
# Use with JDBC drivers that can accept large
# blocks of delimited text at once.
send_full_script=true

Ich habe auto_commit = false, send_full_script = true und duldMultiqueries = true (zu URL) hinzugefügt, um die gesamte Migration in einer Transaktion zu halten.

Gibt es irgendwelche MySQL -URL -Parameter, die ich verwenden muss, um dies zuzulassen? Ist das überhaupt möglich? Scheint, als sollte es sein. Vielleicht müssen wir nur eine Migration für jede Aussage erstellen, aber das scheint übermäßig zu sein.

Beispiel

Hier ist ein weiteres Beispiel zur Klärung

Beispiel Migration 20110318154857_fix_daily_sales:

--// fix daily_sales naming
-- Migration SQL that makes the change goes here.

ALTER TABLE `daily_sales` CHANGE COLUMN `storeId` `store_id` INT(10) UNSIGNED NOT NULL;

b0rked;

--//@UNDO
-- SQL to undo the change goes here.
... undo sql here ....

Wenn ich migriere, schlägt es fehl b0rked; Zeile wie erwartet. Der Migrationsstatus zeigt die Migration wie erwartet als erwartet anhängig.

20110318130407 2011-03-18 17:06:24 create changelog
20110318144341 2011-03-18 17:06:30 fix schedule naming
20110318154857    ...pending...    fix daily sales naming

Meine Datenbank hat jedoch die Änderungen angewendet! nicht gut!

describe daily_sales;
+-----------+------------------+------+-----+---------+-------+
| Field     | Type             | Null | Key | Default | Extra |
+-----------+------------------+------+-----+---------+-------+
| store_id  | int(10) unsigned | NO   | PRI | NULL    |       |
| sale_date | date             | NO   | PRI | NULL    |       |
| type_id   | int(10) unsigned | NO   | PRI | NULL    |       |
| tokens    | int(10) unsigned | NO   |     | 0       |       |
| dollars   | double           | NO   |     | 0       |       |
+-----------+------------------+------+-----+---------+-------+
5 rows in set (0.00 sec)

Gibt es eine Möglichkeit, dies zu verhindern? Sollte ich einfach jede Aussage in eine Migration einfügen und weitermachen? Dort bin ich gerade.

Danke im Voraus.

War es hilfreich?

Lösung

DML ist niemals transaktional - sofort angewendet. Es gibt keine Möglichkeit, es zurückzusetzen

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top