【问题标题】:Liquibase transaction demarcationLiquibase 事务划分
【发布时间】:2017-07-12 22:46:44
【问题描述】:

我有 2 个 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 上运行这些语句时,两者的行为是一致的,因为 MySql(InnoDB) 会将每个语句包装在一个单独的事务中。 为什么 Liquibase 不一致?

【问题讨论】:

  • 检查autocommit。此外,ALTER 将终止任何事务。

标签: java mysql innodb liquibase


【解决方案1】:

我想我可以在进一步调查后自己回答这个问题。 一些语句,由于多种原因,其中之一是它们很难回滚,将在它们执行之前执行和隐式提交。 你可以检查它here。 同时,Liquibase 默认有一个有趣的configuration

runInTransaction 是否应该将 changeSet 作为单个事务运行(如果可能)? 默认为真。

如果你把这两个事实放在一起,答案就很明显了: 当一个 cahngeset 中有一个 ALTER 时,它将隐式地与前面的语句区分开来。由 DB 本身提供。 Liquibase 不能影响这个低级 DB 特性。但是,当这些语句不需要隐式提交时,Liquibase 将能够将语句分组到 1 个事务中。

【讨论】:

    猜你喜欢
    • 2014-04-24
    • 1970-01-01
    • 1970-01-01
    • 2013-01-20
    • 1970-01-01
    • 2017-09-17
    • 2013-09-05
    • 2020-12-03
    • 2019-03-09
    相关资源
    最近更新 更多