最近做的项目中出现了锁表的问题,导致表无法进行事务(DML)操作,经过排查发现,我们项目中的购物车表有个字段cart_id为uuid类型,并且未设置索引,这里的场景是根据cart_id进行更新内容,Mysql InnoDB行锁不使用索引锁表的时候会锁整张表。

通过命令查询锁日志找到相关锁的sql语句:

show engine innodb status;mysql tables in use 1, locked 1
LOCK WAIT 2 lock struct(s), heap size 1136, 1 row lock(s)
MySQL thread id 485176, OS thread handle 140383913969408, query id 12481371 222.93.77.61 root updating
UPDATE `o_cart_detail` SET MODIFY_TIME = now() WHERE (`cart_id`='1')
------- TRX HAS BEEN WAITING 28 SEC FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 2655 page no 4 n bits 144 index PRIMARY of table `o_cart_detail` trx id 5518915 lock_mode X locks rec but not gap waiting
Record lock, heap no 2 PHYSICAL RECORD: n_fields 15; compact format; info bits 0

通过执行计划分析sql语句:

通过执行计划来看,更新语句并未使用到索引。并且where条件的字段是非索引字段,此时的更新操作是全表锁。

此时我们的修改方案是先进行cart_id字段添加索引,保证业务正常进行。

添加非唯一索引后。再次进行执行计划分析sql语句。此时锁定的记录行从2058 ->  55;此时的更新操作是行锁。

当然最好还是使用唯一索引进行DML操作。

总结:InnoDB 的锁,与索引类型,事务的隔离级别相关。InnoDB 到底是行锁还是表锁取决于你的 SQL 语句。如果查询没有命中索引,也将退化为表锁。InnoDB 的行锁是实现在索引上的,而不是锁在物理行记录上。所以如果访问没有命中索引,也无法使用行锁,将要退化为表锁

MySQL InnoDB update锁表问题Record Locks相关推荐

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

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

  2. Oracle 共享锁和排它锁、 DML和DDL锁、 for update 锁表的问题

    共享锁和排它锁 oracle有两种模式的锁:排他锁(exclusive lock,即X锁)和共享锁(share lock,即S锁). 共享锁:如果事务T对数据A加上共享锁后,则其他事务只能对A再加共享 ...

  3. 什么情况下mysql innodb会发生回表操作?

    什么情况下mysql innodb会发生回表操作? 回表是什么意思? 什么是索引覆盖? 为什么设置了命中了索引但还是造成了全表扫描 MySQL innodb的 主键索引是簇集索引(聚簇索引),也就是索 ...

  4. mysql innodb 全表锁,Mysql InnoDB行锁及表锁分享

    一. 背景知识 二. 步入正题:表锁和行锁 1.1. 表锁 vs 行锁 在 MySQL 中锁的种类有很多,但是最基本的还是表锁和行锁:表锁指的是对一整张表加锁,一般是 DDL 处理时使用,也可以自己在 ...

  5. mysql innodb 排他锁_MySQL 针对 InnoDB 引擎锁的种类:行锁(共享锁和排他锁)和表锁(意向共享锁和意向排他锁)...

    InnoDB 锁快速到底 行锁:共享锁(S).排他锁(X) 表锁:意向共享锁(IS).意向排他锁(IX) 下面主要针对 MySQL 中行级锁中的共享锁(S)与排他锁(X)进行分析 共享锁又称为读锁,简 ...

  6. 阿里云mysql不让锁表_MySQL中InnoDB锁不住表的原因

    MySQL中InnoDB锁不住表是因为如下两个参数的设置: mysql> show variables like '%timeout%'; +-------------------------- ...

  7. mysql update锁表_MySQL执行update语句是锁行还是锁表分析

    我们在数据库执行update语句的时候,到底是锁表还是锁行?这里直接用MySQL上例子测试下. 一.环境准备 1.新建一个表create table test_update( id BIGINTnot ...

  8. 巧用MySQL InnoDB引擎锁机制解决死锁问题

    案例如下: 在使用Show innodb status检查引擎状态时,发现了死锁问题: *** (1) TRANSACTION: TRANSACTION 0 677833455, ACTIVE 0 s ...

  9. mysql innodb 间隙锁_MySQL中InnoDB的间隙锁问题

    在为一个客户排除死锁问题时我遇到了一个有趣的包括InnoDB间隙锁的情形.对于一个WHERE子句不匹配任何行的非插入的写操作中,我预期事务应该不会有锁,但我错了.让我们看一下这张表及示例UPDATE. ...

最新文章

  1. SQL重要知识点梳理!
  2. 让智能手机和居家电脑互联互通(WM6 GPRS)
  3. bower failed: UNABLE_TO_VERIFY_LEAF_SIGNATURE
  4. 亚里士多德千年前的猜想,被这群MIT本科生向前推进了一步
  5. 泛型(Generic)-反射泛形-Dao
  6. 洛谷【p2817】 宋荣子的城堡
  7. 如何能出令自己满意的代码
  8. [react] 受控组件和非受控组件有什么区别?
  9. ubuntu server版本安装指南(1)
  10. 新款iPhone SE预约量超40万,拼多多已经安排上,击穿底价2999元?
  11. 数据库测试JBDCTest
  12. 【opencv】错误提示OpenCV Error: Assertion failed
  13. linux制作iso启动盘
  14. [buuctf] crypto全解——85-120(不建议直接抄flag)
  15. 计算机用老毛桃u盘备份系统,如何一键备份还原系统?老毛桃一键备份系统详细步骤...
  16. iOS开发 黑暗模式
  17. WIN7搜索工具everything
  18. 工作站 显卡 测试软件,CineBench R15测试:考验CPU+GPU_工作站移动工作站-中关村在线...
  19. Presto(二)开启安全认证
  20. 【数学篇】论从一题四解到分式与整式

热门文章

  1. socket与tcp/ip编程
  2. [洛谷1462 ]通往奥格瑞玛的道路---二分答案+spfa
  3. みつあみの猫 Mitsuami no Neko | mmd动作+镜头
  4. 虚拟主机解压/压缩功能说明
  5. 从LAMP搭建到项目部署_tp5
  6. Windows下QT实现托盘程序及系统托盘刷新
  7. Jenkins 流水线 获取git 分支列表_CI/CD 工具选型:Jenkins 还是 GitLab CI/CD?
  8. linux 离线迅雷下载软件,linux 下使用迅雷离线下载
  9. ChatGPT这么火,对留学有什么影响?
  10. C#_Word详细解析