gorp_locks

package module
v0.0.0-...-782f3bf Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 28, 2023 License: MIT Imports: 7 Imported by: 0

README

Gorp Locks

一、这是什么

基于golang的gorm框架gorp封装的分布式锁的API:

https://github.com/go-gorp/gorp

二、安装

go get -u github.com/storage-lock/go-gorp-locks

三、API示例代码

3.1 MySQL

package main

import (
	"context"
	"database/sql"
	gorp_locks "github.com/storage-lock/go-gorp-locks"
	storage_lock "github.com/storage-lock/go-storage-lock"
	"gopkg.in/gorp.v1"
)

func main() {

	// 连接数据库
	mysqlDsn := "root:UeGqAm8CxYGldMDLoNNt@tcp(127.0.0.1:3306)/storage_lock_test"
	db, err := sql.Open("mysql", mysqlDsn)
	if err != nil {
		panic(err)
	}

	// 创建gorp的客户端
	dbMap := &gorp.DbMap{Db: db, Dialect: gorp.SqliteDialect{}}
	// 从gorp的客户端创建分布式锁工厂
	factory, err := gorp_locks.GetGorpLockFactory(context.Background(), dbMap)
	if err != nil {
		panic(err)
	}

	// 使用工厂创建一把锁
	lockId := "task-id-10086"
	lock, err := factory.CreateLock(lockId)
	if err != nil {
		panic(err)
	}
	// 开始使用锁来竞争资源
	ownerId := storage_lock.NewOwnerIdGenerator().GenOwnerId()
	err = lock.Lock(context.Background(), ownerId)
	if err != nil {
		panic(err)
	}
	// 锁使用完要记得释放
	defer func() {
		err := lock.UnLock(context.Background(), ownerId)
		if err != nil {
			panic(err)
		}
	}()

	// 下面编写的代码都是全局互斥的,同一时间只会有一个owner的代码被执行
	// ...

}

3.2 PostgreSQL

package main

import (
	"context"
	"database/sql"
	gorp_locks "github.com/storage-lock/go-gorp-locks"
	storage_lock "github.com/storage-lock/go-storage-lock"
	"gopkg.in/gorp.v1"
)

func main() {

	// 连接数据库
	postgresqlDsn := "host=127.0.0.1 user=postgres password=postgres port=5432 dbname=postgres sslmode=disable"
	db, err := sql.Open("postgres", postgresqlDsn)
	if err != nil {
		panic(err)
	}

	// 创建gorp的客户端
	dbMap := &gorp.DbMap{Db: db, Dialect: gorp.SqliteDialect{}}
	// 从gorp的客户端创建分布式锁工厂
	factory, err := gorp_locks.GetGorpLockFactory(context.Background(), dbMap)
	if err != nil {
		panic(err)
	}

	// 使用工厂创建一把锁
	lockId := "task-id-10086"
	lock, err := factory.CreateLock(lockId)
	if err != nil {
		panic(err)
	}
	// 开始使用锁来竞争资源
	ownerId := storage_lock.NewOwnerIdGenerator().GenOwnerId()
	err = lock.Lock(context.Background(), ownerId)
	if err != nil {
		panic(err)
	}
	// 锁使用完要记得释放
	defer func() {
		err := lock.UnLock(context.Background(), ownerId)
		if err != nil {
			panic(err)
		}
	}()

	// 下面编写的代码都是全局互斥的,同一时间只会有一个owner的代码被执行
	// ...

}

3.3 sqlite3

2023-10-29 02:25:32 待修复,现在有点bug似乎...

package main

import (
	"context"
	"database/sql"
	gorp_locks "github.com/storage-lock/go-gorp-locks"
	storage_lock "github.com/storage-lock/go-storage-lock"
	"gopkg.in/gorp.v1"
)

func main() {

	// 连接数据库
	sqliteDbPath := "storage_lock_test.db3"
	db, err := sql.Open("sqlite3", sqliteDbPath)
	if err != nil {
		panic(err)
	}

	// 创建gorp的客户端
	dbMap := &gorp.DbMap{Db: db, Dialect: gorp.SqliteDialect{}}
	// 从gorp的客户端创建分布式锁工厂
	factory, err := gorp_locks.GetGorpLockFactory(context.Background(), dbMap)
	if err != nil {
		panic(err)
	}

	// 使用工厂创建一把锁
	lockId := "task-id-10086"
	lock, err := factory.CreateLock(lockId)
	if err != nil {
		panic(err)
	}
	// 开始使用锁来竞争资源
	ownerId := storage_lock.NewOwnerIdGenerator().GenOwnerId()
	err = lock.Lock(context.Background(), ownerId)
	if err != nil {
		panic(err)
	}
	// 锁使用完要记得释放
	defer func() {
		err := lock.UnLock(context.Background(), ownerId)
		if err != nil {
			panic(err)
		}
	}()

	// 下面编写的代码都是全局互斥的,同一时间只会有一个owner的代码被执行
	// ...

}

Documentation

Index

Constants

View Source
const GorpConnectionManagerName = "gorp-connection-manager"

Variables

This section is empty.

Functions

func CreateStorageForGorp

func CreateStorageForGorp(dbMap *gorp.DbMap) (storage.Storage, error)

CreateStorageForGorp 尝试从gorp创建Storage

func GetGorpLockFactory

func GetGorpLockFactory(ctx context.Context, dbMap *gorp.DbMap) (*storage_lock_factory.StorageLockFactory[*sql.DB], error)

GetGorpLockFactory @Description: 从gorp创建一个锁工厂,后续可以拿着这个锁工厂再创建 @param ctx 超时控制之类的 @param dbMap gorp对应的dbMap @return *storage_lock_factory.StorageLockFactory[*sql.DB] @return error

func NewGorpLock

func NewGorpLock(ctx context.Context, dbMap *gorp.DbMap, lockId string) (*storage_lock.StorageLock, error)

NewGorpLock @Description: 基于gorp创建一把分布式锁 @param ctx @param dbMap gorp的map,用于进行各种gorp的操作,锁操作需要用到这些api @param lockId 要创建的锁的ID,ID相同即被认为是同一把锁,同一把锁会互相排斥 @return *storage_lock.StorageLock @return error

func NewGorpLockWithOptions

func NewGorpLockWithOptions(ctx context.Context, dbMap *gorp.DbMap, options *storage_lock.StorageLockOptions) (*storage_lock.StorageLock, error)

NewGorpLockWithOptions @Description: @param ctx @param dbMap @param options @return *storage_lock.StorageLock @return error

Types

type GorpConnectionManager

type GorpConnectionManager struct {
	// contains filtered or unexported fields
}

GorpConnectionManager 复用gorp的数据库连接(https://github.com/go-gorp/gorp

func NewGorpConnectionManager

func NewGorpConnectionManager(dbMap *gorp.DbMap) *GorpConnectionManager

func (*GorpConnectionManager) Name

func (x *GorpConnectionManager) Name() string

func (*GorpConnectionManager) Return

func (x *GorpConnectionManager) Return(ctx context.Context, db *sql.DB) error

func (*GorpConnectionManager) Shutdown

func (x *GorpConnectionManager) Shutdown(ctx context.Context) error

func (*GorpConnectionManager) Take

func (x *GorpConnectionManager) Take(ctx context.Context) (*sql.DB, error)

type GorpLockFactory

type GorpLockFactory struct {
	*storage_lock_factory.StorageLockFactory[*sql.DB]
	// contains filtered or unexported fields
}

GorpLockFactory gorp的锁工厂,可以创建好多锁啥的

func NewGorpLockFactory

func NewGorpLockFactory(dbMap *gorp.DbMap) (*GorpLockFactory, error)

NewGorpLockFactory 从*gorp.DbMap中创建

Directories

Path Synopsis
examples
mysql command
postgresql command
sqlite3 command

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL