Mysql行锁失效情况分析

一、概述

数据库版本:使用Mysql8.0.32作为测试版本,InnoDB引擎。
本文阐述Mysql行锁失效升级为表的场景。

二、测试

  • 使用远程终端打开两个数据库服务器(Linux)窗口,使用如下命令登录:
mysql -u root -p

回车,输入数据库密码.

  • 测试数据库为: test
show databases;
use test;
  • 关闭自动提交
set autocommit=0;
  • 测试数据表为:
CREATE TABLE `t_run_work_order`  (
  `id` bigint(0) UNSIGNED NOT NULL AUTO_INCREMENT,
  `work_no` varchar(40) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL COMMENT '工单编号',
  `data_guid` varchar(40) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL COMMENT '报警ID',
  `dept_id` bigint(0) NOT NULL COMMENT '组织结构ID',
  `flow_id` varchar(40) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL COMMENT '流程ID',
  `node_id` varchar(40) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL COMMENT '当前流程',
  `work_title` varchar(40) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL COMMENT '工单标题',
  `work_state` char(1) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL COMMENT '状态',
  `is_exception` char(1) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL COMMENT '是否异常',
  `is_invalid` char(1) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL COMMENT '是否有效',
  `create_time` datetime(0) NOT NULL COMMENT '创建时间',
  `version` int(0) NOT NULL DEFAULT 0 COMMENT '版本号',
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE INDEX `u_data_guid`(`data_guid`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 11903 CHARACTER SET = utf8mb3 COLLATE = utf8mb3_general_ci COMMENT = 'XX信息表' ROW_FORMAT = Dynamic;

其中id是主键。

插入两条id分别为7742、7743的记录。

  • 对比测试:
    在左侧窗口执行:
mysql> update t_run_work_order set work_title='OTHE-L'' where id='7742';
Query OK, 1 row affected (16.49 sec)
Rows matched: 1  Changed: 1  Warnings: 0

在右侧窗口执行:

update t_run_work_order set work_title='OTHE-R' where id='7742';

我们发现,右侧命令会阻塞。
阻塞原因:左侧命令执行后,尚未提交,锁住了id为7742的记录;
接下来,在左侧窗口执行:

commit;

观察右侧窗口,右侧窗口命令执行成功。

那么,如果我们同时对不同的记录进行操作呢?

在左侧窗口执行:

mysql> update t_run_work_order set work_title='OTHE-L'' where id='7742';
Query OK, 1 row affected (16.49 sec)
Rows matched: 1  Changed: 1  Warnings: 0

在右侧窗口执行:

update t_run_work_order set work_title='OTHE-R' where id='7743';
Query OK, 1 row affected (12.49 sec)
Rows matched: 1  Changed: 1  Warnings: 0

我们发现,两边都执行成功,没有阻塞。
这说明:分表对不同主键的记录进行更新操作,互不影响。因为他们只是锁住了各自的记录,也就是行锁。

接下来,我们测试一下使用非索引字段作为条件进行更新操作。
在左侧窗口执行:

mysql> update t_run_work_order set work_title='OTHE-L'' where data_guid='56c24ba9-49c7-471c-b77f-a3f38043d429'';
Query OK, 1 row affected (16.49 sec)
Rows matched: 1  Changed: 1  Warnings: 0

在右侧窗口执行:

update t_run_work_order set work_title='OTHE-R' where data_guid='56c24ba9-49c7-471c-b77f-a3f38043d428';

右侧窗口阻塞。

我们在左侧窗口执行

commit;

命令提交。然后观察右侧窗口,右侧窗口立即执行成功。
这说明了,对使用非索引字段作为条件对记录进行操作时,行锁会失效,升级为表锁,此时,其他更新、删除操作都会处于阻塞状态,直到锁释放。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

oyezitan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值