我有2个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 :(得分:0)
我想经过一番进一步调查后,我自己可以自己回答。 有些语句由于多种原因导致它们很难回滚,它们会在执行之前执行并隐式提交。 你可以查看它here。 同时,Liquibase默认有一个有趣的configuration:
runInTransaction 是否应将changeSet作为单个事务运行(如果可能)? 默认为true。
如果你将这两个事实放在一起,答案就变得很明显了: 当cahngeset中有一个ALTER时,它将与前面的语句隐式划分。由DB本身提供。 Liquibase不能影响这种低级数据库功能。但是,当这些语句不需要隐式提交时,Liquibase将能够将语句分组为1个事务。