【发布时间】:2021-02-19 02:11:38
【问题描述】:
我正在调查是否可以在我一直从事的项目中使用 Flyway 进行数据库架构迁移……数据库迁移是手动完成的,我真的很想开始使用 Flyway。
这是一个 Spring Boot (v2.2.0) 应用程序,我正在尝试使用 Flyway 版本 v.7.1.1 配置迁移。
我已从数据库生成现有架构并将其设置为 V1 基本版本。但是,当尝试运行应用程序时(使用 baseline-on-migrate: true),迁移由于异常而失败:
Caused by: org.flywaydb.core.internal.sqlscript.FlywaySqlScriptException:
Migration failed
-----------------
SQL State : S0001
Error Code : 3964
Message : Transaction failed because this DDL statement is not allowed inside a snapshot isolation transaction. Since metadata is not versioned, a metadata change can lead to inconsistency if mixed within snapshot isolation.
Location : ()
Line : 1
Statement : CREATE TABLE [TestDB].[dbo].[flyway_schema_history] (
[installed_rank] INT NOT NULL,
[version] NVARCHAR(50),
[description] NVARCHAR(200),
[type] NVARCHAR(20) NOT NULL,
[script] NVARCHAR(1000) NOT NULL,
[checksum] INT,
[installed_by] NVARCHAR(100) NOT NULL,
[installed_on] DATETIME NOT NULL DEFAULT GETDATE(),
[execution_time] INT NOT NULL,
[success] BIT NOT NULL
);
从应用配置来看,HikariCP 数据源配置设置为使用:
事务隔离:TRANSACTION_SQL_SERVER_SNAPSHOT_ISOLATION_LEVEL
如果事务隔离更改为例如TRANSACTION_READ_COMMITTED 迁移成功。我可以按预期执行所有其他迁移。 软件架构师告诉我快照隔离级别背后的原因是因为应用程序用于生成大量报告,这可能需要几个小时,而快照隔离级别“保护我们免受应用程序冻结和锁定”。
我尝试通过创建回调来解决这个问题,我可以在运行时、beforeMigrate 和 afterMigrate Java 回调中更改事务隔离,但在运行时无法更改 HikariDataSource 配置。
有人可以提供一些建议,是否可以通过快照隔离进行迁移(和创建基线架构)?
【问题讨论】:
标签: sql-server spring flyway transaction-isolation