树莓派开发笔记(十七):树莓派4B+上Qt多用户连接操作Mysql数据库同步(单条数据悲观锁)
前言
安装了mysq数据库,最终时为了实现在一个树莓派上实现多用户多进程操作的同步问题,避免数据并发出现一些错误,本篇安装了远程服务并且讲述了使用Qt进行悲观锁for update操作,命令行进行同步查询的示例。
其他操作
这里只是稍微提一下,具体参照博主的树莓派系列博客,非常详细。
远程登陆界面
sudo apt-get install tightvncserver
sudo apt-get install xrdp
sudo service xrdp restart
sudo ufw allow 3389
sudo service ufw restart
然后可以使用window远程桌面登陆了:
默认用户名:pi
默认密码:raspberry


安装qt5
sudo apt-get install qt5-default
sudo apt-get install qtcreator
安装好后,远程桌面的程序里面就多了个qtcreator了:


创建一个界面工程,然后运行:
(编译速度比几年前的3B+快一些,后续开发过程中测试一下,是否可以忽略3B+的交叉编译)

检查数据库驱动:

没有mysql的数据库驱动。
sudo apt-get install libqt5sql5-mysql

Qt操作mariadb数据库
QSqlDatabase db;
db = QSqlDatabase::addDatabase("QMYSQL");
db.setHostName("127.0.0.1");
db.setPort(3306);
db.setDatabaseName("data");
db.setUserName("root");
db.setPassword("a1234567");
if(db.open())
{
LOG << "Succeed to open db";
}else{
LOG << "Failed to open db:" << db.lastError().text();
return;
}
QString cmd = "select * from student;";
QSqlQuery query = db.exec(cmd);
while(query.next())
{
LOG << query.value(0).toString()
<< query.value(1).toString()
<< query.value(2).toString()
<< query.value(3).toString();
}

多用户操作
本意是为了多用户操作,那么读的时候需要加读锁,写的时候需要加写锁。
两个用户同时读取了数据库中的一条记录,此时用户A对其中一个字段的值进行了修改操作并进行了提交,后来用户B也对这个字段进行了修改,用户B的提交将会覆盖用户A提交的值。

锁类型
悲观锁
每次去取数据,很悲观,都觉得会被别人修改,所以在拿数据的时候都会上锁。简言之,共享资源每次都只给一个线程使用,其他线程阻塞,等第一个线程用完后再把资源转让给其他线程。synchronized和ReentranLock等都是悲观锁思想的体现。
乐观锁
每次去取数据,都很乐观,觉得不会被被人修改。因此每次都不上锁,但是在更新的时候,就会看别人有没有在这期间去更新这个数据,如果有更新就重新获取,再进行判断,一直循环,直到拿到没有被修改过的数据。(mysql需要自己实现乐观锁)。
for update使用场景(悲观锁)
for update 可以为数据库中的一行数据加上一个排它锁。当一个事务的操作未完成时候,其他事务可以读取但是不能写入或更新。
如果项目对某个数据准确性有要求,并且项目存在并发(不一定高并发),则需要使用 for update。
比如:用户A使用余额购买商品,此时用户B向用户A发起转账,如果恰好处在同一时间,则可能造成用户A最终余额错误。此时需要使用 for update 进行数据加锁防止出错。
这种情况下,即使并发很小,但是也会有一定的概率会碰到,而余额的错误即使差一分钱也是不能容忍的,所以这种特定的场景,即使不是高并发,也应该使用 for update 规避问题。
for update 用法
begin;
select * from XXX where XXX for update;
...
commit;
for update 必须在事务中才生效。
Qt测试
使用127.0.0.1的ip进行连接(本地连接)
QSqlDatabase db;
db = QSqlDatabase::addDatabase("QMYSQL");
db.setHostName("127.0.0.1");
db.setPort(3306);
db.setDatabaseName("data");
db.setUserName("root");
db.setPassword("a1234567");
if(db.open())
{
LOG << "Succeed to open db";
}else{
LOG << "Failed to open db:" << db.lastError().text();
return;
}
if(db.transaction())
{
QString cmd = "select * from student for update;";
QSqlQuery query = db.exec(cmd);
while(query.next())
{
LOG << query.value(0).toString()
<< query.value(1).toString()
<< query.value(2).toString()
<< query.value(3).toString();
}
for(int index = 0; index < 10; index++)
{
QThread::sleep(1);
LOG << "sleep:" << index;
}
if(!db.commit())
{
LOG << "Failed to commit";
}
}

至此,我们的锁加入成功,说清楚原理可以方便大家着手开始开发多用户进程操作数据库的同步开发了。
使用局域网的ip进行连接(远程连接)
QSqlDatabase db;
db = QSqlDatabase::addDatabase("QMYSQL");
db.setHostName("192.168.0.103");
db.setPort(3306);
db.setDatabaseName("data");
db.setUserName("root");
db.setPassword("a1234567");
if(db.open())
{
LOG << "Succeed to open db";
}else{
LOG << "Failed to open db:" << db.lastError().text();
return;
}
if(db.transaction())
{
QString cmd = "select * from student for update;";
QSqlQuery query = db.exec(cmd);
while(query.next())
{
LOG << query.value(0).toString()
<< query.value(1).toString()
<< query.value(2).toString()
<< query.value(3).toString();
}
for(int index = 0; index < 10; index++)
{
QThread::sleep(1);
LOG << "sleep:" << index;
}
if(!db.commit())
{
LOG << "Failed to commit";
}
}
连接不上:

这个时候需要修改下配置:
sudo vi /etc/mysql/mariadb.conf.d/50-server.cnf

重启服务:
systemctl restart mysql.service

继续测试,下面是用树莓派使用局域网ip(之前也不能连接127.0.0.1):

连接成功,然后在局域网pc上连接,但是不能打开事务:

修改一下:

这个其实是跟mysql驱动有关系,因为笔者是几年前弄得libmysql.dll和libmysqld.dll,这个不深究了,已经可以远程操作了。
树莓派开发笔记(十七):树莓派4B+上Qt多用户连接操作Mysql数据库同步(单条数据悲观锁)的更多相关文章
- 树莓派开发笔记(十一):蓝牙的使用,BlueZ协议(双树莓探测rssi并通过蓝牙互传获取的rssi信号强度)
若该文为原创文章,转载请注明原文出处本文章博客地址:https://blog.csdn.net/qq21497936/article/details/110940484长期持续带来更多项目与技术分享, ...
- 树莓派开发笔记(十四):入手研华ADVANTECH工控树莓派UNO-220套件(三):使用研发自带系统测试rtc、gpio、232和485套件接口
前言 上一篇说明了必须要使用研华自带的8G卡的系统,通过沟通拿到了相关的系统,购买的时候会带8GB的卡,请自行备份一份镜像.本篇对uno-220套件的相关研华配套的额外接口做测试,篇幅较长,重点讲 ...
- 树莓派开发笔记(十二):入手研华ADVANTECH工控树莓派UNO-220套件(一):介绍和运行系统
前言 树莓派也可以做商业应用,工业控制,其稳定性和可靠性已经得到了验证,故而工业控制,一些停车场等场景也有采用树莓派作为主控的,本片介绍了研华ADVANTECH的树莓派套件组UNO-220-P4N ...
- python开发_python操作mysql数据库
如果你还没有准备好开发环境,你不妨花上一小点时间去看看:python开发_mysqldb安装 本篇blog是有关python操作mysql数据的相关内容. 我做了一个demo: 先看运行效果: mys ...
- 原生Jdbc操作Mysql数据库开发步骤
原生Jdbc操作Mysql数据库开发步骤 原生的Jdbc就是指,不使用任何框架,仅用java.sql包下的方法实现数据库查询等的操作. 下面是开发步骤: 1.导入数据库驱动包 ...
- 【码上开心】Windows环境mysql数据库使用(二)skip-grant-tables 与用户名密码修改
skip-grant-tables #跳过数据库权限验证 我们安装MySql 设置my.ini配置文件的时候,常常会在my.ini中添加 skip-grant-tables ,这时接数据库可以使用任意 ...
- 树莓派开发笔记(十五):树莓派4B+从源码编译安装mysql数据库
前言 树莓派使用数据库时,优先选择sqlite数据库,但是sqlite是文件数据库同时仅针对于单用户的情况,考虑到多用户的情况,在树莓派上部署安装mysql服务,通过读写锁事务等使用,可以实现多进 ...
- Hi3516开发笔记(十):Qt从VPSS中获取通道图像数据存储为jpg文件
前言 上一篇已经将himpp套入qt的基础上进行开发.那么qt中拿到frame则是很关键的交互,这是qt与海思可能编解码交叉开发的关键步骤. 受限制 因为直接配置sample的vi比较麻烦 ...
- 树莓派玩耍笔记4 -- 树莓派ssh党必备的配置
1. 关闭桌面显示 对于ssh 党.当然不须要系统花费资源在显示上. 所以我们先在 "raspi-conifg" 下选择默认启动为Text 启动(这好像也是Raspbian 的默认 ...
随机推荐
- Struts2-day2总结
一.结果页面配置 1.全局结果页面 2.局部结果页面 ****注:如果同时配置了全局页面和局部页面配置,那么最终将以局部为准 result标签当中的type属性 默认值:dispatcher做转发 r ...
- C/C++在Win32控制台播放Bad Apple
##前言 这里首先你需要准备一些文件,将一个Bad Apple的视频分别转换成txt和mp3格式(mp3用来作为背景音乐) 我将txt文件放到exe文件目录下的子目录files里了 转换方法可以用Ad ...
- 邮件html页编写指南
前言 写过邮件的html一般都用table来布局,为什么呢?原因是大多数的邮件客户端(比如Outlook和Gmail),会过滤经过多次的邮件编写实践及度娘的指导,我发现,编写自制兼容outlook与f ...
- 百度飞桨数据处理 API 数据格式 HWC CHW 和 PIL 图像处理之间的关系
使用百度飞桨 API 例如:Resize Normalize,处理数据的时候. Resize:如果输入的图像是 PIL 读取的图像这个数据格式是 HWC ,Resize 就需要 HWC 格式的数据. ...
- Find the Maximum - 题解【思维,贪心】
题面 这是2022年ICPC昆明站的F题.在赛场上,我一开始敲了个贪心,但是出锅了,改敲树形DP,但是时间来不及了.在队友的提醒下补过了这个题,知道解法的我发现我就是个纯纯的老坛-- 原题链接在牛客网 ...
- 《手写Mybatis》第5章:数据源的解析、创建和使用
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 管你吃几碗粉,有流量就行! 现在我们每天所接收的信息量越来越多,但很多的个人却没有多 ...
- 安装黑苹果 、 Mac OS虚拟机
Mac OS 虚拟机 所需文件地址 unlocker 为VMware 新增Apple Mac OS X操作系统 Install_macOS_Monterey_12.0.1_21A559.iso 提取码 ...
- python数据处理-matplotlib入门(2)-利用随机函数生成变化图形2
鉴于上一篇中最后三个问题: 1.上述程序是否能进行优化(比如功能相同的) 2.创建三个3个实例,用了3个语句,能否建一个函数,只输入一个数n,就自动创建n个实例?同时,每个实例的num_times随机 ...
- 【问题解决】'Access-Control-Allow-Origin' header contains multiple values '*, *', but only one is allowed.
问题复述 今天项目组有人找我说之前部署的程序在测试环境没问题,到生产环境出现了奇怪的问题,点按钮没反应. 我通过腾讯会议发现他们的浏览器控制台上打出了如下错误: Access to XMLHttpRe ...
- 【面试普通人VS高手系列】讲一下wait和notify这个为什么要在synchronized代码块中?
一个工作七年的小伙伴,竟然不知道"wait"和"notify"为什么要在Synchronized代码块里面. 好吧,如果屏幕前的你也不知道,请在评论区打上&qu ...