refactor(mysql): 适配PXC严格模式,替换全局锁方案
重构MySQL迁移逻辑,新增acquireMigrationLock适配Percona XtraDB Cluster的pxc_strict_mode限制,将原有的GET_LOCK迁移锁替换为更兼容的方案,同时为各迁移流程添加快速检查路径减少锁竞争
This commit is contained in:
@@ -58,15 +58,16 @@ func ensureSnowflakePrimaryKeys(db *sqlx.DB) error {
|
||||
}
|
||||
defer conn.Close()
|
||||
|
||||
var locked sql.NullInt64
|
||||
if err = conn.QueryRowContext(ctx,
|
||||
"SELECT GET_LOCK("+snowflakeMigrationLock+", 60)").Scan(&locked); err != nil {
|
||||
// PXC strict-mode clusters prohibit GET_LOCK; acquireMigrationLock falls back
|
||||
// to lock-free execution in that case. migrateSnowflakePrimaryKey checks the
|
||||
// current state of every table before touching it, so it is idempotent.
|
||||
_, unlock, err := acquireMigrationLock(ctx, conn, snowflakeMigrationLock)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if !locked.Valid || locked.Int64 != 1 {
|
||||
return errors.New("mysql: timed out waiting for snowflake primary-key migration lock")
|
||||
if unlock != nil {
|
||||
defer unlock()
|
||||
}
|
||||
defer conn.ExecContext(ctx, "SELECT RELEASE_LOCK("+snowflakeMigrationLock+")")
|
||||
|
||||
for _, spec := range snowflakePrimaryKeySpecs {
|
||||
if err = migrateSnowflakePrimaryKey(ctx, conn, spec); err != nil {
|
||||
|
||||
Reference in New Issue
Block a user