我了解到Liquibase在一个事务中运行每个changeSet,并在插入DATABASECHANGELOG表后提交它。
如果在changeSet期间出现错误,事务将被回滚。
我的问题是,如果changeSet还包括<rollback>
标记会发生什么。我知道回滚标记与liquibase专用回滚命令结合使用,但是在常规迁移期间,哪个具有优先级,是回滚标记的命令还是事务终止?
当update
失效时,<rollback>
块不被使用。如果更新失败,Liquibase只调用"回滚"。依赖于连接,并依赖于数据库来正确回滚。<rollback>
块仅在执行单独的rollback
命令时使用,其中我们要"撤消"。已经在数据库中提交的变更集。
注意:事实上,Liquibase依赖于连接rollback
来恢复失败的更新,这就是为什么你必须小心,如果你有多个语句在同一个changeSet。如果有两个createTable调用,并且数据库在第一个和第二个调用失败后自动提交,那么连接上的rollback
将不会回滚第一个表。因此,当您下次运行update
时,您将从第一个createTable获得table already exists
错误。关于哪些语句自动提交的规则是特定于数据库的,所以最好的经验法则是"每个更改集只有一条语句">