当前位置: 首页 > 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() ;}}
}

相关文章:

mysql实现分布式锁

利用数据库的悲观锁实现分布式锁,实际应用中要考虑mysql的高可用。 DistributedLock.h #ifndef DistributedLock_H_ #define DistributedLock_H_// // DistributedLock.h: // #include "base/MySQLDriver.h" class CDistributedLock { public://// Construction/D…...

MySQL快速使用

关系型数据库&#xff08;RDBMS&#xff09;&#xff1a;建立在关系模型基础上&#xff0c;由多张相互连接的二维表组成的数据库 特点&#xff1a;使用表存储数据&#xff0c;格式统一方便维护&#xff1b;使用SQL语言操作&#xff0c;标准统一使用方便 通用语法&#xff1a; …...

LeetCode41.缺失的第一个正数

1. 题目大意 给你一个未排序的整数数组 nums &#xff0c;请你找出其中没有出现的最小的正整数。 请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。 2. 思路分析 示例 1&#xff1a; 输入&#xff1a;nums [3,4,-1,1] 输出&#xff1a;2 解释&#xff1…...

ee trade:黄金投资与股票投资的区别

黄金和股票&#xff0c; 是金融市场中两种常见的投资工具&#xff0c; 它们拥有截然不同的特点和风险&#xff0c; 了解它们的差异&#xff0c; 可以帮助投资者制定更合理的投资策略。 一、 投资性质&#xff1a; 避险与成长&#xff0c; 两种投资方向 黄金&#xff1a; 被视…...

AI视频创作原理

重磅推荐专栏: 《大模型AIGC》 《课程大纲》 《知识星球》 本专栏致力于探索和讨论当今最前沿的技术趋势和应用领域,包括但不限于ChatGPT和Stable Diffusion等。我们将深入研究大型模型的开发和应用,以及与之相关的人工智能生成内容(AIGC)技术。通过深入的技术解析和实践经…...

idea vue项目删除node_modules时报文件损坏且无法读取,导致删除失败

解决办法&#xff0c;查看node_modules所在盘&#xff0c;右击点击属性-工具&#xff0c;点击检查驱动&#xff0c;查完后修复即可&#xff0c; 就能够成功删除损坏的文件了...

Linux下编译安装-单机模式

1.1 Linux下编译安装-单机模式 1.1.1 安装 (1).把安装包放在Linux文件系统下 (2).解压缩 tar -zxf redis-4.0.2.tar.gz (3).切换到解压后的目录 cd redis-4.0.2(4).编译 make(5).进入到src目录 cd src(6).执行安装 make install(7) .返回上级目录 cd .. (8) .修改配置&…...

RSSI定位算法

文章目录 一、定位算法简介1.1. 定位技术原理1.2. 定位算法二、RSSI测距原理2.1. 建模与测量终端到基站的距离三、定位3.1. 三边定位算法3.2. 加权三边定位算法3.3. 加权三角形质心定位算法3.4. 程序定位算法的执行流程一、定位算法简介 1.1. 定位技术原理 定位终端接收到iBe…...

布局管理(Layouts)-Qt-思维导图-学习笔记

布局管理(Layouts) Qt 提供了非常丰富的布局类&#xff0c;主要包括以下基本布局管理类 QBoxLayout 提供了水平和垂直的布局管理&#xff0c;可以将子部件按行或列排列。根据排列方向的不同&#xff0c;QBoxLayout 分为 QHBoxLayout&#xff08;水平布局&#xff09;和 QVBox…...

《区块链赋能游戏业:破解虚拟资产交易与确权难题》

在当今数字化的时代&#xff0c;游戏行业正以前所未有的速度发展&#xff0c;虚拟资产在游戏中的重要性日益凸显。然而&#xff0c;虚拟资产的交易和确权问题一直困扰着游戏开发者和玩家。随着区块链技术的引入&#xff0c;为解决这些问题带来了新的曙光。 首先&#xff0c;我…...

机器学习第十一章-特征选择与稀疏学习

11.1子集收集与评价 属性称为"特征" &#xff0c;对当前学习任务有用的属性称为"相关特征" 、没什么用的属性称为"无关特 征" . 从给定的特征集合中选择出相关特征于集的过程&#xff0c;称为"特征选择"。 特征选择是一个重要的"…...

C#中客户端直接引用服务端Proto文件

gRPC 客户端是从 .proto 文件生成的具体客户端类型。 具体 gRPC 客户端具有转换为 .proto 文件中 gRPC 服务的方法。 下一步打开【服务引用】 控制面板 选择grpc选项&#xff0c;然后继续 到此配置完成&#xff0c;然后就和服务共用一份protocol文件...

SiLM5932SHO系列SiLM5932SHOCG-DG 12A/12A强劲驱动电流能力 支持主动短路保护功能(ASC)单通道隔离门极驱动器

SiLM5932SHO系列是一款单通道隔离驱动器&#xff0c;提供12A源电流和12A灌电流。主动保护功能包括退饱和过流检测、UVLO、隔离故障报警和 4A 米勒钳位。输入侧电源的工作电压为3V至5.5V&#xff0c;输出侧电源的工作电压范围为13V至30V。所有电源电压引脚都有欠压锁定 (UVLO) 保…...

本地项目上传github

一、先在github&#xff08;GitHub: Let’s build from here GitHub&#xff09;上创建仓库 1&#xff0c;登录github后&#xff0c;点击右上角头像&#xff0c;点击 Your repositories 2&#xff0c;点击new 3&#xff0c;填写仓库名&#xff0c;假设命名 testhub&#xff0…...

使用zip包来安装mysql

下载 下载地址mysql,使用5.7.23 配置环境变量 添加到系统变量中 C:\Users\Admin\Downloads\mysql-5.7.23-win32\bin 添加my.ini配置文件 在C:\Users\Admin\Downloads\mysql-5.7.23-win32目录下添加my.ini [mysqld] # 设置3306端口 port3306# 自定义设置mysql的安装目录 b…...

嵌入式面经篇十——驱动开发

文章目录 前言一、驱动开发1、Linux 驱动程序的功能是什么&#xff1f;2、内核程序中申请内存使用什么函数&#xff1f;3、内核程序中申请内存和应用程序时申请内存有什么区别&#xff1f;4、自旋锁和信号量在互斥使用时需要注意什么&#xff1f;在中断服务程序里面的互斥是使用…...

MySQL(四)——常用函数

文章目录 函数字符串函数数值函数日期函数流程函数 函数 函数&#xff0c;是指一段可以直接被另一段程序调用的程序或代码。 MySQL中内置了许多函数&#xff0c;我们只需在合适的场景下调用它们即可&#xff0c;调用函数查询结果直接使用SELECT即可&#xff0c;并且可以嵌套使…...

C++ //练习 17.38 扩展上一题中你的程序,将读入的每个单词打印到它所在的行。

C Primer&#xff08;第5版&#xff09; 练习 17.38 练习 17.38 扩展上一题中你的程序&#xff0c;将读入的每个单词打印到它所在的行。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#xff1a;vim 代码块 #include<iostream> #include<…...

NC 丑数

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文章男女通用&#xff0c;看懂了就去分享给你的码吧。 描述 把只包含质因…...

Spring Boot 整合 Spring AI 实现项目接入ChatGPT(OpenAl的调用)

当前各种AI项目层出不穷&#xff0c;但绝大多数都是用python写的&#xff0c;现在Spring开源了Spring AI项目&#xff0c;让Java开发者也可以轻松给自己的springboot项目集成AI能力。目前spring AI正式版本为0.8.1&#xff0c;支持接入openAI、Ollama、Azure openAI、Huggingfa…...

智慧医疗能源事业线深度画像分析(上)

引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...

ssc377d修改flash分区大小

1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

关于nvm与node.js

1 安装nvm 安装过程中手动修改 nvm的安装路径&#xff0c; 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解&#xff0c;但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后&#xff0c;通常在该文件中会出现以下配置&…...

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下&#xff0c;虚拟教学实训宛如一颗璀璨的新星&#xff0c;正发挥着不可或缺且日益凸显的关键作用&#xff0c;源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例&#xff0c;汽车生产线上各类…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练

前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1)&#xff1a;从基础到实战的深度解析-CSDN博客&#xff0c;但实际面试中&#xff0c;企业更关注候选人对复杂场景的应对能力&#xff08;如多设备并发扫描、低功耗与高发现率的平衡&#xff09;和前沿技术的…...

2.Vue编写一个app

1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

Robots.txt 文件

什么是robots.txt&#xff1f; robots.txt 是一个位于网站根目录下的文本文件&#xff08;如&#xff1a;https://example.com/robots.txt&#xff09;&#xff0c;它用于指导网络爬虫&#xff08;如搜索引擎的蜘蛛程序&#xff09;如何抓取该网站的内容。这个文件遵循 Robots…...

Spring AI 入门:Java 开发者的生成式 AI 实践之路

一、Spring AI 简介 在人工智能技术快速迭代的今天&#xff0c;Spring AI 作为 Spring 生态系统的新生力量&#xff0c;正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务&#xff08;如 OpenAI、Anthropic&#xff09;的无缝对接&…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)

目录 一、&#x1f44b;&#x1f3fb;前言 二、&#x1f608;sinx波动的基本原理 三、&#x1f608;波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、&#x1f30a;波动优化…...

视觉slam十四讲实践部分记录——ch2、ch3

ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...