Liquibase 事务回滚与 <rollback> 标签

Liquibase transaction rollback vs <rollback> tag

我了解到 Liquibase 在事务中运行每个 changeSet 并在插入到 DATABASECHANGELOG 后提交它 table。

如果在 changeSet 期间出现问题,事务将被回滚。

我的问题是,如果 changeSet 还包含一个 <rollback> tag,会发生什么情况。 我知道回滚标签与 liquibase dedicated rollback commands 结合使用,但在常规迁移期间哪个优先,回滚标签的命令还是事务中止?

<rollback>块在update失败时不使用。如果更新失败,Liquibase 只会在连接上调用“回滚”并依赖数据库正确回滚。 <rollback> 块仅在执行单独的 rollback 命令时使用,我们正在“撤消”已在数据库中提交的变更集。

注意: 事实上,Liquibase 依赖连接 rollback 来恢复失败的更新,这就是为什么如果您在同一个语句中有多个语句,则必须小心变更集。如果您有两个 createTable 调用并且您的数据库 auto-commits 在第一个和第二个失败后,连接上的 rollback 将不会回滚第一个 table。所以当你下次 运行 update 时,你会从第一个 createTable 得到一个 table already exists 错误。关于 auto-commit 是 database-specific 的语句的规则,因此好的经验法则是“每个变更集只有一个语句”