1)幂等迁移是一种可以运行多次的迁移,但仍然具有与仅运行一次相同的效果。为了达到这个目的,你不需要每次修改数据库表时都要写表创建代码。试图做到这一点也将变得不可能很快保持。
基本上,在您的迁移脚本中编写语句时,您需要知道第一次运行此语句之前数据库的状态。现在,请考虑必须对语句进行哪些修改,以确保即使它之前已经运行过,它也可以无误地运行。
例如:如果你的数据库是状态A,并且在运行迁移x到它到达B:
M(A, x) -> B
然后,你需要写X,使数据库状态还是B还送如果x然再次:
M(B, x) -> B
这将允许您运行相同的迁移脚本不止一次(得心应手例如,如果在脚本中的语句中的一个失败,但以前的成功)。
2)接下来,设置outOfder = true将允许flyway运行尚未运行的任何迁移,即使迁移比最新运行的迁移早。因此,如果您有三次迁移,x,y和z(按此顺序),并且x和z针对数据库运行,然后未设置outOfOrder,则一旦可用,flyway就不会运行y,因为z已经运行。但是,如果将标志设置为true,y现在基本上会在z之后运行。
现在,如果你设置outOfOrder为true,你需要意识到这一点可能性,你的数据库的起始状态之前,在数据库中,现在有两个不同的值:
其中A是初始状态:
M(A, x) -> B
M(B, y) -> C
M(C, z) -> E
(Taking the state from A -> B -> C -> E)
M(A, x) -> B
M(B, z) -> D
M(D, y) -> E
(Taking the state from A -> B -> D -> E)
所以前y为然,状态可以是B或d和前z为RAN中,状态可以是B或C.由此,需要被写入所以迁移脚本ÿ除了是幂等的,它还可以用于它的起始状态,并允许z在它跑完之后仍然起作用(z必须正确运行f或状态B和C两者)。