Skip to content

Commit 001b2f0

Browse files
authored
Merge branch 'golang-migrate:master' into master
2 parents 8d57316 + 2788339 commit 001b2f0

File tree

1 file changed

+13
-7
lines changed

1 file changed

+13
-7
lines changed

database/sqlserver/sqlserver.go

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ var (
3333
ErrMultipleAuthOptionsPassed = fmt.Errorf("both password and useMsi=true were passed.")
3434
)
3535

36-
var lockErrorMap = map[mssql.ReturnStatus]string{
36+
var lockErrorMap = map[int]string{
3737
-1: "The lock request timed out.",
3838
-2: "The lock request was canceled.",
3939
-3: "The lock request was chosen as a deadlock victim.",
@@ -198,18 +198,24 @@ func (ss *SQLServer) Lock() error {
198198
return err
199199
}
200200

201-
// This will either obtain the lock immediately and return true,
202-
// or return false if the lock cannot be acquired immediately.
201+
// This will block until the lock is acquired.
203202
// MS Docs: sp_getapplock: https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-getapplock-transact-sql?view=sql-server-2017
204-
query := `EXEC sp_getapplock @Resource = @p1, @LockMode = 'Update', @LockOwner = 'Session', @LockTimeout = 0`
203+
query := `
204+
DECLARE @lockResult int;
205+
EXEC @lockResult = sp_getapplock @Resource = @p1, @LockMode = 'Exclusive', @LockOwner = 'Session', @LockTimeout = -1;
206+
SELECT @lockResult;`
205207

206-
var status mssql.ReturnStatus
207-
if _, err = ss.conn.ExecContext(context.Background(), query, aid, &status); err == nil && status > -1 {
208+
var status int
209+
if err = ss.conn.QueryRowContext(context.Background(), query, aid).Scan(&status); err == nil && status > -1 {
208210
return nil
209211
} else if err != nil {
210212
return &database.Error{OrigErr: err, Err: "try lock failed", Query: []byte(query)}
211213
} else {
212-
return &database.Error{Err: fmt.Sprintf("try lock failed with error %v: %v", status, lockErrorMap[status]), Query: []byte(query)}
214+
errorDescription, ok := lockErrorMap[status]
215+
if !ok {
216+
errorDescription = "Unknown error"
217+
}
218+
return &database.Error{Err: fmt.Sprintf("try lock failed with error %v: %v", status, errorDescription), Query: []byte(query)}
213219
}
214220
})
215221
}

0 commit comments

Comments
 (0)