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 的语句的规则,因此好的经验法则是“每个变更集只有一个语句”
我了解到 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 的语句的规则,因此好的经验法则是“每个变更集只有一个语句”