2017-02-22 9 views
0

Ich habe 2 Beispiele für Liquibase Changesets, wo die zweite Aussagen versagen (versucht, einen Datensatz einfügen mit vorhandenen Primärschlüssel), aber die ersten, die erfolgreich sind:Liquibase Transaktionsdemarkation

Failing/keine Aufzeichnung in databasechangelog:

--changeset yura:2 
insert into test2 values (4, 'test4'); 
insert into test2 values (2, 'test2'); 

teilweise geschrieben, kein Eintrag in databasechangelogg:

--changeset yura:2 
insert into test2 values (4, 'test4'); 
ALTER TABLE test2 ADD name varchar(50); 

Wenn ich versuche, diese Aussagen auf MySql direkt ausführen können, ist das Verhalten c onsistent für beide, weil MySql (InnoDB) jede Anweisung in einer separaten Transaktion umschließt. Warum ist Liquibase nicht konsistent?

+0

Überprüfen Sie auf "Autocommit". Außerdem wird 'ALTER' jede Transaktion beenden. –

Antwort

0

Ich denke, ich werde es nach einigen weiteren Untersuchungen selbst beantworten können. Einige Anweisungen, aufgrund mehrerer Gründe, von denen eine sehr schwer zu Rollback ist, werden ausgeführt und implizite Commit vor sie ausführen. Sie können es überprüfen here. Zugleich hat Liquibase eine interessante configuration von Standard:

runInTransaction Sollte die ChangeSet als eine einzelne Transaktion lief werden (wenn möglich)? Der Standardwert ist wahr.

Wenn Sie diese beiden Tatsachen zusammen, wird die Antwort auf der Hand: Wenn es eine ALTER in einem cahngeset ist, wird es implizit aus den vorherigen Aussagen abgegrenzt werden. Mit freundlicher Genehmigung der DB selbst. Liquibase kann diese Low-Level-DB-Funktion nicht beeinflussen. Liquibase kann jedoch Anweisungen in 1 Transaktion gruppieren, wenn diese Anweisungen kein implizites Commit erfordern.