diff --git a/migrator.go b/migrator.go index 3d2b032b..64d80362 100644 --- a/migrator.go +++ b/migrator.go @@ -108,4 +108,8 @@ type Migrator interface { HasIndex(dst interface{}, name string) bool RenameIndex(dst interface{}, oldName, newName string) error GetIndexes(dst interface{}) ([]Index, error) + + // Locking + ObtainLock() error + ReleaseLock() error } diff --git a/migrator/migrator.go b/migrator/migrator.go index 64a5a4b5..bf1cb716 100644 --- a/migrator/migrator.go +++ b/migrator/migrator.go @@ -119,6 +119,12 @@ func (m Migrator) AutoMigrate(values ...interface{}) error { queryTx.DryRun = false execTx = m.DB.Session(&gorm.Session{Logger: &printSQLLogger{Interface: m.DB.Logger}}) } + + if err := execTx.Migrator().ObtainLock(); err != nil { + return err + } + defer execTx.Migrator().ReleaseLock() + if !queryTx.Migrator().HasTable(value) { if err := execTx.Migrator().CreateTable(value); err != nil { return err @@ -985,3 +991,13 @@ func (m Migrator) GetTypeAliases(databaseTypeName string) []string { func (m Migrator) TableType(dst interface{}) (gorm.TableType, error) { return nil, errors.New("not support") } + +// ObtainLock obtains a global migration lock +func (m Migrator) ObtainLock() error { + return nil +} + +// ReleaseLock releases the global migration lock +func (m Migrator) ReleaseLock() error { + return nil +}