2017-02-22 34 views
0

У меня есть 2 примера LiquiBase ревизий, где вторые операторы неудовлетворительные (пытается вставить запись с существующими первичным ключом), но первые из них не являются успешными:LiquiBase разграничения транзакций

В противном случае/нет записи в databasechangelog:

--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 непосредственно, поведение с так как MySql (InnoDB) будет обертывать каждый оператор в отдельной транзакции. Почему Liquibase не соответствует?

+0

Проверьте на 'autocommit'. Кроме того, 'ALTER' прекратит любую транзакцию. –

ответ

0

Я думаю, что смогу ответить на него сам после дальнейшего расследования. Некоторые утверждения из-за нескольких причин, из-за которых они очень тяжелы откатываются, будут выполнять и неявные фиксации до, которые они выполняют. Вы можете это проверить here. В то же время, LiquiBase имеет интересную configuration по умолчанию:

runInTransaction Если ревизия будет выбежала в качестве одной сделки (если это возможно)? По умолчанию true.

Если поместить эти два факта, ответ становится очевидным: Когда есть ALTER внутри cahngeset, он будет неявно отграничен от предыдущих заявлений. Предоставлено самой БД. Liquibase не может влиять на эту низкоуровневую функцию БД. Однако Liquibase сможет группировать операторы в одну транзакцию, когда эти утверждения не требуют неявного фиксации.

 Смежные вопросы

  • Нет связанных вопросов^_^