# README
mysql-lock
a simple distributed lock based on mysql
Usage
go get github.com/vearne/mysql-lock
initialization
mlock.NewCounterLockWithDSN()
mlock.NewCounterLockWithConn()
Notice :Distributed locks based on mysql are not rigorous
For example, at t1, A holds the lock, and B waits for the lock. At t2, the network between A and MySQL is abnormal. MySQL actively releases the lock imposed by A.And B adds the lock. At this time, A will think that it owns the lock; B will also think that it holds the lock. The distributed lock actually fails.
Notice: mysql-lock will create the table.
mysql-lock
creates the table_lock_counter
.
So mysql-lock
needs CREATE
permission. Or you can use doc/schema.sql to create the table yourself.
Example
package main
import (
"context"
mlock "github.com/vearne/mysql-lock"
"log"
"os"
"os/signal"
"syscall"
"time"
)
const (
DSN = "root:9E68-2607F7855D7D@tcp(127.0.0.1:23406)/testdb?charset=utf8&loc=Asia%2FShanghai&parseTime=true"
)
func main() {
debug := false
//debug := true
locker := mlock.NewLockClientWithDSN(DSN, debug)
// init() can be executed multiple times
locker.Init()
clientID := "client1"
lockName := "lock1"
lock, err := locker.NewLock(lockName,
mlock.WithMaxLockTime(20*time.Second),
mlock.WithClientID(clientID))
if err != nil {
log.Println("new lock", err)
return
}
beginTime := time.Now()
// wait until get lock
err = lock.Acquire(context.Background())
if err != nil {
log.Println("can't acquire lock", "error", err)
log.Println(time.Since(beginTime))
return
}
log.Printf("%s got lock [%s]\n", clientID, lockName)
time.Sleep(10 * time.Second)
lock.Release(context.Background())
log.Printf("%s release lock [%s]\n", clientID, lockName)
ch := make(chan os.Signal, 1)
signal.Notify(ch, syscall.SIGTERM, syscall.SIGQUIT, syscall.SIGINT)
<-ch
}
# Packages
No description provided by the author
# Functions
initialize *gorm.DB with an existing database connection.
initialize *gorm.DB with dsn.
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
If an error occurs when performing refresh, execute this callback.
No description provided by the author
No description provided by the author
No description provided by the author
# Constants
No description provided by the author
No description provided by the author
# Variables
No description provided by the author
# Structs
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
# Interfaces
BackOff is a backoff policy for retrying an operation.
No description provided by the author
No description provided by the author