一问题

需求是异步给 IM 发送link消息,所以有一张消息表,每次查询发送失败的数据,并对这些行数据加锁,(避免别的线程再次查询出来发送消息)

select * from message where id > ?1 AND message_status = ?2 and send_times < ?3 order by create_time asc for update
然后调用 IM发送消息的接口 进行补发,发现数据量较多时会出现发送两次消息的情况。

经过分析,发现原来是查出来发送失败的数据时候加锁失败,研究发现,原来 for update锁表必须开启事务,在begin与commit之间才生效。

二总结

InnoDB默认是行级别的锁,当有明确指定的主键时候,是行级锁。否则是表级别。

例子: 假设表foods ,存在有id跟name、status三个字段,id是主键,status有索引。

例1: (明确指定主键,并且有此记录,行级锁) 
SELECT * FROM foods WHERE id=1 FOR UPDATE; 
SELECT * FROM foods WHERE id=1 and state=’待发送’ FOR UPDATE;

例2: (明确指定主键/索引,若查无此记录,无锁) 
SELECT * FROM foods WHERE id=-1 FOR UPDATE;

例3: (无主键/索引,表级锁) 
SELECT * FROM foods WHERE state=’待发送’ FOR UPDATE;

例4: (主键/索引不明确,表级锁) 
SELECT * FROM foods WHERE id<>’3’ FOR UPDATE; 
SELECT * FROM foods WHERE id LIKE ‘3’ FOR UPDATE;

注意,for update 仅适用于InnoDB,并且必须开启事务,在begin与commit之间才生效。

行级锁时,不查到记录,无锁。  表级锁时,不管是否查询到记录,都会锁定表。

转载于:https://www.cnblogs.com/wanghongsen/p/9265531.html

for update在mysql中使用相关推荐

  1. 聊聊MySQL中的锁

    原文地址:http://www.linzichen.cn/article/1571531799593484288 在程序开发中,当多个线程并发操作共享数据时,我们需要保证在任何时刻最多只能有一个线程在 ...

  2. mysql中的merge into,SQL Server 2008中利用merge into关键实现insert/update自动匹配(类似于MySQL中的For Update关键字)...

    SQL Server 2008中利用merge into关键实现insert/update自动匹配(类似于MySQL中的For Update关键字) 语法请参考: 按照语法编写语句 DECLARE @ ...

  3. 【转】MySQL中select * for update锁表的问题

    MySQL中select * for update锁表的问题 由于InnoDB预设是Row-Level Lock,所以只有「明确」的指定主键,MySQL才会执行Row lock (只锁住被选取的资料例 ...

  4. MySQL中update一条record的过程

    在MySQL中,update是原地更新数据,原地更新数据,原地更新数据.重要的事情说3遍.这是不同于PGSQL的. update的具体过程是: (1).先对该条record对应的索引加X锁 (2).将 ...

  5. mysql中视图和表的区别及联系_MySQL中Update、select联用操作单表、多表,及视图与临时表的区别...

    一.MySQL中使用从表A中取出数据来更新表B的内容 例如:要update表data中的一些列属性,但是修改属性的内容来源是来自表chanpin.SQL语言中不要显示的出现select关键字 upda ...

  6. mysql中锁原理及for update悲观锁的详解

    mysql 中有多种多样的锁,今天我们具体分享一下: 一.mysql中乐观锁和悲观锁原理及种类: ​        乐观锁并不是数据库自带的,如果需要使用乐观锁,那么需要自己去实现,一般情况下,我们会 ...

  7. Mysql中使用Update From语句

    记录一下mysql中使用Update from 语句更新字段值: 场景是国家行政区划的数据表,字段内容包括: 应用场景中不想使用级联选择,选中下级节点,比如东城区时,直接显示北京-北京市-东城区,因此 ...

  8. MySQL中的级联删除与更新策略on delete restrict on update restrict

    MySQL中的级联删除与更新策略on delete restrict on update restrict 在MySQL中,当我们执行级联删除与级联更新时,可能会执行On Delete Restric ...

  9. mysql中一条update的执行过程

    一.Server层阶段: 连接器:负责跟客户端建立连接.获取权限.维持和管理连接 分析器:验证通过以后,分析器会对该语句分析, 判断是否语法有错误等. 优化器:选择索引,生成执行计划. 执行器:根据优 ...

最新文章

  1. keras 的 example 文件 cnn_seq2seq.py 解析
  2. 实战:基于深度学习的道路损坏检测
  3. linux文件 i节点结构,Linux 文件描述符 文件表项 i节点结构
  4. 费曼:所有的科学知识都是不确定的
  5. anguarjs 图片预览_Text to Image Converter(文字转图片软件)下载-Text to Image Converter(文字转图片软件)v1.5绿色版下载...
  6. spring事务提交回滚原理mybatis版
  7. 在 SAP BTP 平台 Neo 环境里使用 SAP Cloud SDK 创建应用
  8. 魔板(信息学奥赛一本通-T1449)
  9. 解决只可以上QQ却不可以上网问题
  10. po3580SuperMemo(splay)
  11. android 不生成odex文件方法
  12. OsharpNS轻量级.net core快速开发框架简明入门教程-多上下文配置(多个数据库的使用)...
  13. pytorch ImageFolder
  14. MFC编程——Where is WinMain?
  15. java经纬度转地址_经纬度转地址示例代码
  16. 2799元即可畅享12GB+256GB超大存储,荣耀60 SE新版本正式发布
  17. 木瓜蛋白酶改性金纳米粒修饰淀粉/二氧化硅复合微球/硒化镉/聚苯乙烯荧光二氧化硅微球的研究
  18. python-乌龟吃小鱼(小游戏)
  19. 2015美团校招部分笔试题
  20. 基于张正友平面标定法的摄像机标定及GUI实现

热门文章

  1. python进阶06并发之二技术点关键词
  2. k-means及变种
  3. 兰州大学c语言课程作业答案,2016兰州大学C语言程序设计课程作业1附答案.doc
  4. 如何规划农商行商业智能系统中的决策分析系统?
  5. python调试神器_Python里三个最高逼格的调试神器
  6. vue条件渲染指令if/show
  7. Python中setdefault,deepcopy,copy函数(一分钟读懂)
  8. php 抽象类 接口 区别,PHP中抽象类和接口有什么区别
  9. java 线程 listview_android使用Thread实现json数据的传递,并且使用ListView显示
  10. 查看python版本命令_Anaconda常用命令小结