2017-02-22 6 views
0

は、私は2番目の文は(既存の主キーを持つレコードを挿入しようとして)失敗しているLiquiBaseをチェンジセットの2例を持っているが、最初のものは成功しません:databasechangelogでLiquiBaseをトランザクション境界

失敗/なし記録:

部分的に書き込まれ
--changeset yura:2 
insert into test2 values (4, 'test4'); 
insert into test2 values (2, 'test2'); 

、databasechangeloggでの記録なし:

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

私は直接MySQLの上でこれらのステートメントを実行しようとすると、動作はc MySql(InnoDB)はすべての文を別のトランザクションでラップするため、両方に一貫性があります。 なぜLiquibaseは一貫性がありませんか?

+0

'autocommit'をチェックしてください。また、 'ALTER'はどんなトランザクションも終了します。 –

答えて

0

さらなる調査を経て、私は自分でそれに答えることができると思います。 複数の理由の1つは、ロールバックが非常に難しく、実行し、を暗黙的にコミットしてからを実行するまでのステートメントです。 hereで確認できます。 は同時に、LiquiBaseをデフォルトで面白いconfigurationがあります

runInTransactionチェンジは、単一のトランザクション(可能な場合)として実行されるべきか? デフォルトはtrueです。あなたが一緒にこれら二つの事実を置く場合

は、答えは明らかに次のようになります。cahngeset内部ALTERがある場合 、それは暗黙的に、前の文から区切られます。 DB自体の礼儀。 Liquibaseはこの低レベルのDB機能に影響を与えることはできません。しかし、Liquibaseは、暗黙のコミットを必要としない文を1つのトランザクションにグループ化することができます。