当前位置: 首页 > news >正文

mysql实现分布式锁

利用数据库的悲观锁实现分布式锁,实际应用中要考虑mysql的高可用。

DistributedLock.h

#ifndef DistributedLock_H_
#define DistributedLock_H_//
// DistributedLock.h: 
//
#include "base/MySQLDriver.h"
class CDistributedLock
{
public://// Construction/Destruction//CDistributedLock(server::mysqldb::MySQLConnection* c, const std::string& path, uint64_t key, uint16_t partitions = 16);~CDistributedLock();operator bool(){return m_bLocked;}bool getLocked(){return m_bLocked;}bool getDbDeaded(){return m_bDbDead;}private:server::mysqldb::MySQLConnection* con_;bool		m_bLocked; //获取分布式锁是否成功bool		m_bDbDead;  //数据库是否是否宕机
};
#endif

DistributedLock.cpp

//
// DistributedLock.cpp: 
//#include "DistributedLock.h"
#include "logger.h"
#include "base/common.h"
#include <string>
#include <sys/timeb.h>
#include <time.h>//
// Construction/Destruction
//char*   log_Time(void)
{struct  tm      *ptm;struct  timeb   stTimeb;static  char    szTime[19];ftime(&stTimeb);ptm = localtime(&stTimeb.time);sprintf(szTime, "%02d-%02d %02d:%02d:%02d.%03d",ptm->tm_mon + 1, ptm->tm_mday, ptm->tm_hour, ptm->tm_min, ptm->tm_sec, stTimeb.millitm);szTime[18] = 0;return szTime;
}CDistributedLock::CDistributedLock(server::mysqldb::MySQLConnection* c,const std::string& path,uint64_t key,uint16_t partitions) 
{m_bLocked = false ;m_bDbDead = false;con_ = c ;if ( c ){server::mysqldb::Statement st = c->createStatement() ;char szSQL[256] ;sprintf(szSQL,"insert into %s_%d (lock_key,lock_ts) values (" UINT64FORMAT ",now()) on duplicate key update lock_ts=now()",path.c_str(),uint16_t(key % partitions), key) ;st.prepare(szSQL) ;int errcode = 0;std::string errwhat;for(int i = 0; i < 3; ++i) {try {server::mysqldb::ResultSet result = st.execute();if (result.getAffectedRows() > 0){LogTrace(Info, "Distributed lock get succeed , affectedRows %d tms %s", result.getAffectedRows(), log_Time());m_bLocked = true;}else{LogTrace(Warn, "Distributed lock get failed , affectedRows %d tms %s", result.getAffectedRows(), log_Time());}break;} catch (server::mysqldb::Exception &e) {c->reconnect();errcode = e.code();errwhat = e.what();LogTrace(Error, "statemt error, %d %s try again !", errcode, errwhat.c_str());}}if(!m_bLocked) {LogTrace(Error, "sql execute error, code:%d, reason:%s", errcode, errwhat.c_str());}}else{LogTrace(Error, "get distributed lock failed, lock db is gone !");m_bDbDead = true;}
}CDistributedLock::~CDistributedLock()
{	if ( con_ ) {try {m_bLocked ? con_->commit() : con_->rollback() ;} catch (server::mysqldb::Exception &e) {	LogTrace(Error, "commit execute error, code:%d, reason:%s", e.code(), e.what());	con_->close() ;}}
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 力学笃行(五)Qt key绑定、钩子(hook)
  • H5漂流瓶交友源码_社交漂流瓶H5源码
  • csrf漏洞(二)
  • GNS3 IOU: License section not found in iourc file /tmp/tmpj54abrhf/iourc
  • day01-作业题
  • 深度学习入门(E):逻辑回归与分类到底是啥关系?
  • CoOp(论文解读):Learning to Prompt for Vision-Language Models
  • C:指针学习-指针变量—学习笔记
  • 手机群控爬取实战
  • 数据结构与算法--插入排序与选择排序
  • Upload-Lab第11关:如何巧妙使用双写绕过黑名单验证
  • 大模型智能体可以用来实现哪些需求?
  • 防火墙技术与地址转换
  • 服务器主要有什么用途?什么情况下需要服务器?
  • xss GAME (xss漏洞攻击1-8)
  • 2018一半小结一波
  • CAP理论的例子讲解
  • Centos6.8 使用rpm安装mysql5.7
  • Cumulo 的 ClojureScript 模块已经成型
  • Gradle 5.0 正式版发布
  • Java知识点总结(JDBC-连接步骤及CRUD)
  • JS变量作用域
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • Twitter赢在开放,三年创造奇迹
  • Web设计流程优化:网页效果图设计新思路
  • 编写符合Python风格的对象
  • 分类模型——Logistics Regression
  • 工作踩坑系列——https访问遇到“已阻止载入混合活动内容”
  • 关于Java中分层中遇到的一些问题
  • 诡异!React stopPropagation失灵
  • 前端
  • 思维导图—你不知道的JavaScript中卷
  • 通过npm或yarn自动生成vue组件
  • 微信小程序填坑清单
  • 新手搭建网站的主要流程
  • 一、python与pycharm的安装
  • 用jquery写贪吃蛇
  • 在Mac OS X上安装 Ruby运行环境
  • 找一份好的前端工作,起点很重要
  • 正则表达式
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • 直播平台建设千万不要忘记流媒体服务器的存在 ...
  • ​​​​​​​STM32通过SPI硬件读写W25Q64
  • ​configparser --- 配置文件解析器​
  • !!【OpenCV学习】计算两幅图像的重叠区域
  • # 服务治理中间件详解:Spring Cloud与Dubbo
  • #QT(一种朴素的计算器实现方法)
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • (7)STL算法之交换赋值
  • (floyd+补集) poj 3275
  • (JS基础)String 类型
  • (LeetCode C++)盛最多水的容器
  • (分享)一个图片添加水印的小demo的页面,可自定义样式
  • (简单) HDU 2612 Find a way,BFS。
  • (十八)三元表达式和列表解析