【场景】多个应用实例,不约而同地从数据库查询哪些任务未被执行,然后更新这些任务的状态字段为“正在执行”。

(简述,多个消费者争领任务,同时需要宣布哪个任务被自己领取,而不至于让多个消费者重复领取同一个任务)

方案一:SELECT FOR UPDATE(糟糕的方案╮(╯﹏╰)╭)

SELECT FOR UPDATE 这个语句貌似很适合并发查询并更新的场景,因为它会自动上锁(当使用了索引时是行锁,否则是表锁)。

但稍有不慎,很容易造成阻塞,例如这里《MySQL行锁深入研究》

方案二:应用层分布式锁

可以在应用层使用一个分布式锁(可以放在Memcache中),控制同一时间,只允许一个应用实例进行查询并更新的操作。

方案三:利用数据库的乐观锁(建议采用)

[sql] view plaincopy
  1. 1、增加一个字段,如ver,int值,默认为0
  2. 2、select ,同时获取ver 值
  3. SELECT user, ver FROM table_b WHERE  c=0
  4. 3、update时检查ver 值是否为第2步获取到的值 (类似于CompareAndSet)
  5. UPDATE table_b SET ver=4,user='xx' WHERE c=0 AND ver=3
  6. 如果update的记录数为1,则表示成功;
  7. 如果update的记录数为0,则表示已经被其他应用(线程)update过了,需作异常处理
  8. ---------------------------------------------------
  9. 不用ver,使用代表任务状态的字段代替ver也是可以的。

转载于:https://www.cnblogs.com/wynjauu/articles/9190255.html

[MYSQL]如何并发查询并更新相关推荐

  1. 《MySQL tips:并发查询与并发连接区别》

    并发连接与并发查询,并不是一个概念. 在执行show processlist的结果里,看到了几千个连接,指的是并发连接. 而"当前正在执行"的语句,才是并发查询. 并发连接数多影响 ...

  2. mysql多表查询插入更新_Mysql多表查询,多表插入和多表更新

    /*************************************by garcon1986************************************************* ...

  3. MySQL 多表查询和更新练习

    1) 先创建数据库和设置数据库: CREATE DATABASE HOSPITAL; USE hospital; 2) 创建三个数据表:tb_department, tb_doctor, tb_pat ...

  4. mysql级联查询_mysql 各种级联查询后更新(update select)

    mysql  各种级联查询后更新(update select). CREATE TABLE `tb1` ( `id` int(11) NOT NULL, `A` varchar(100) defaul ...

  5. MYSQL多线程并发操作同一张表同一个字段的更新问题

    MYSQL多线程并发操作同一张表同一个字段的更新问题? 可以用乐观锁方案: 在表里增加个字段,版本号字段 每次更新前先从数据库里获取这个版本号的值,然后更新时要同步更新版本号+1,并且增加更新条件版本 ...

  6. 高并发场景下更新数据库报错,记录一次 MySQL 死锁问题的解决

    作者 l 会点代码的大叔(CodeDaShu) 今天隔壁项目组的开发小姐姐找到我,说她们项目正在做压力测试,更新 MySQL 数据库的一张表时,总是发生死锁,日志大概是这个样子的: org.sprin ...

  7. mysql 记录更新 内部_MySQL 入门(1):查询和更新的内部实现

    摘要 在MySQL中,简单的CURD是很容易上手的. 但是,理解CURD的背后发生了什么,却是一件特别困难的事情. 在这一篇的内容中,我将简单介绍一下MySQL的架构是什么样的,分别有什么样的功能.然 ...

  8. mysql更新id最大_我们可以在单个MySQL查询中更新具有最高ID的行吗?

    是的,我们可以做到.让我们首先创建一个表-mysql> create table DemoTable ( ID int, GameScore int ); 使用插入命令在表中插入一些记录-mys ...

  9. Mysql更新计数器_MySQL实现计数器如何在高并发场景下更新并保持数据正确性

    一张表 两个字段 一个id 一个useCount 表里存了100个id 每个id对应自己的useCount 业务场景是:当id每使用一次 useCount要加1. 当useCount大于1000时 这 ...

最新文章

  1. OpenGL tessmodes细分模式的实例
  2. 区块链入局,51小长假听歌、打游戏的姿势将被颠覆!
  3. 二十一 JDK注解注解案例
  4. 十年编程经验凝结 与新人们分享
  5. 20年的老程序员对新入行的朋友的一些建议
  6. 关于在windows上首次编译运行pbrt-3
  7. 信息安全软考——第四章 网络安全体系与网络安全模型 知识点记录
  8. 三调 图斑地类面积_图斑地类面积理论值计算方法说明 -
  9. Ubuntu 安装显卡驱动 CUDA10 cuDNN详细教程
  10. 用二维码分享WiFi密码(转)
  11. 双目视觉焦距_双目视觉成像原理
  12. A*算法和dijkstra算法
  13. 网络模块与RJ45水晶头接线方法
  14. C++高阶 常对象和常函数
  15. AUTOCAD——特性匹配
  16. 中国软件公司100强排名
  17. 股票量化分析工具QTYX使用攻略——形态选股结果回测(更新v2.5.6)
  18. JQuery-weui city-picker动态加载数据
  19. 华为云hica学习笔记
  20. 游戏建模初学者必看的游戏人物模型贴图制作方法及制作小技巧

热门文章

  1. IPsec ***路由配置
  2. 正则表达式批量替换 单引号
  3. 盲人浏览网页辅助工具之一
  4. JavaScript汉字Unicode编码相互转换
  5. Md5 Loader Demo
  6. 用python批量下载modis数据的速度怎么样_MODIS数据的简介和下载(五)——应用密钥的Python脚本下载...
  7. 元组的创建、元组的特性(索引、切片、重复、连接、成员操作符、迭代)
  8. Linux下的虚拟机拷贝与快照生成
  9. 5-顺序表查找及插入问题
  10. python函数递归 汉诺塔