若该文为原创文章,转载请注明原文出处
本文章博客地址:https://hpzwl.blog.csdn.net/article/details/125188715
红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…(点击传送门)

树莓派开发专栏

上一篇:《树莓派开发笔记(十六):树莓派4B+安装mariadb数据库(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+安装mariadb数据库(mysql开源分支)并测试基本操作》
下一篇:敬请期待…

本文章博客地址:https://hpzwl.blog.csdn.net/article/details/125188715

树莓派开发笔记(十七):树莓派4B+上Qt多用户连接操作Mysql数据库同步(单条数据悲观锁)相关推荐

  1. 树莓派开发笔记(十一):蓝牙的使用,BlueZ协议(双树莓探测rssi并通过蓝牙互传获取的rssi信号强度)

    若该文为原创文章,转载请注明原文出处 本文章博客地址:https://blog.csdn.net/qq21497936/article/details/110940484 长期持续带来更多项目与技术分 ...

  2. 【树莓派学习笔记】树莓派4B上运行uboot并从网络启动linux内核(上)

    [树莓派学习笔记]树莓派4B上运行uboot并从网络启动linux内核(上) 文章目录 [树莓派学习笔记]树莓派4B上运行uboot并从网络启动linux内核(上) 前言 1. 硬件需求与软件版本汇总 ...

  3. 树莓派开发笔记(十四):入手研华ADVANTECH工控树莓派UNO-220套件(三):使用研发自带系统测试rtc、gpio、232和485套件接口

    若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/124754769 红胖子(红模仿)的博文大全:开发技术集 ...

  4. 树莓派开发笔记(五):GPIO引脚介绍和GPIO的输入输出使用(驱动LED灯、检测按键)

    若该文为原创文章,未经允许不得转载 原博主博客地址:https://blog.csdn.net/qq21497936 原博主博客导航:https://blog.csdn.net/qq21497936/ ...

  5. 树莓派开发笔记(九):基于CSI口的摄像头拍照程序(同样适用USB摄像头)

    若该文为原创文章,未经允许不得转载 原博主博客地址:https://blog.csdn.net/qq21497936 原博主博客导航:https://blog.csdn.net/qq21497936/ ...

  6. 树莓派学习笔记——定时向yeelink上传树莓派CPU温度

    0 前言 本文通过python文件IO操作获得树莓派CPU温度信息,通过python request库周期性向yeelink平台上传温度,修改rc.local脚本使得该python脚本在开机时便在后台 ...

  7. Java 开发笔记 - wangEditor 编辑器图片上传

    Java 开发笔记 - wangEditor 编辑器图片上传 前言 转型 java 开发后入手的第一个项目,写写博客记录一下 该项目使用的是 sping boot + mybatis plus + t ...

  8. Qt开发笔记(一):Qt+FFmpeg开发环境搭建以及工程模板

    原博主博客地址:https://blog.csdn.net/qq21497936 本文章博客地址:https://blog.csdn.net/qq21497936/article/details/90 ...

  9. java计算机毕业设计河南口腔医疗机构线上服务系统源码+mysql数据库+系统+lw文档+部署

    java计算机毕业设计河南口腔医疗机构线上服务系统源码+mysql数据库+系统+lw文档+部署 java计算机毕业设计河南口腔医疗机构线上服务系统源码+mysql数据库+系统+lw文档+部署 本源码技 ...

最新文章

  1. 敏捷开发中如何做质量管理?
  2. 山西流感就诊比持续上升 专家为民答疑解惑
  3. 看一家公司发展得如何就看这家公司的财务部门
  4. centos6.8防火墙模块未加载
  5. Linux搭建虚拟机,桥接模式下,主机能够Ping通虚拟机,虚拟机ping不通主机
  6. ●BZOJ 4556 [Tjoi2016Heoi2016]字符串
  7. 动态规划—最长公共子串
  8. 5-3 神经网络算法预测销量高低(改进版,消除了一些warning)
  9. 第5课 - 线性表的本质
  10. 编写一个C程序,实现以下功能:用一个函数实现两个字符串的比较,即自己写一个strcmp函数,函数原型为:int strcmp(char *p1,char *p2);设p1指向字符串s
  11. 07/11/10 资料整理
  12. 程序员如何拓展知识面 推荐几个技术公众号
  13. python 调用另一个py_Python打包:setuptools与setup.py/.cfg入门简介
  14. 校招刷题---java选择题笔记01
  15. php常用函数字符串操作回顾
  16. 如何解决This system is not registered with RHN.
  17. 搭建Web站点和FTP站点
  18. petalinux笔记
  19. 如何在直播、会议、视频中使用虚拟形象
  20. Java Base64 加密与解密

热门文章

  1. 在那山的这边海的那边有一群程序员
  2. 用计算机对视频进行剪裁和编辑,Win10系统剪裁视频功能怎么用?windows10剪裁视频功能使用方法介绍...
  3. Django Iframe +Form 上传图片文件等 前端显示
  4. WebGL 3D 电信机架实战之数据绑定
  5. Android中错误Annotation processors must be explicitly declared now. The following dependencies on the
  6. win11系统开机后没有输入法——解决方法亲测有效
  7. 实验9-9 有理数比较(10 分)
  8. No module named '_bz2'
  9. 简介:Virtual Kubelet
  10. ios 按钮下面加下划线_IOS UIlabel 、UIButton添加下划线