mysql锁表解决方案简书,针对mysql的分布式锁解决方案

背景

分布式锁有很多中实现方式,此文针对的是,在加锁后是针对mysql做相应操作

原理简介

get_lock是会话中有效的(会话结束,锁释放),只要我们后续的操作使用同一个链接,那么可以保证后续的操作是都是在在锁中

release_lock则是释放锁

示意代码

package main

import (

"context"

"database/sql"

"fmt"

)

func main() {

dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?%s",

"root",

"password",

"127.0.0.1",

3306,

"test",

)

db, err := sql.Open("mysql", dsn)

if err != nil {

panic(err)

}

ctx := context.Background()

conn, err := db.Conn(ctx)

if err != nil {

panic(err)

}

var success bool

if err:=conn.QueryRowContext(ctx,"select get_lock(?,?)","lock",1).Scan(&success);err!=nil{

panic(err)

}

if !success{

panic("conflict")

}

defer func(){conn.QueryRowContext(ctx,"select release_lock(?)","lock").Scan(&success)}()

tx, err := conn.BeginTx(ctx, nil)

if err != nil {

panic(err)

}

defer tx.Rollback()

_,err=tx.ExecContext(ctx,"insert into tets(name,password) values(?,?)","test","test")

if err!=nil{

panic(err)

}

if err:=tx.Commit();err!=nil{

panic(err)

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值