MySQL中innerDB引擎的锁机制

InnoDB支持事务,InnoDB默认使用行级锁。

默认是行级锁,但有些情况,就会变成表级锁。下面用update的例子进行说明,表和数据如下:

一张用户信息表,ID是主键(主键默认带有索引)

表中有两条数据

行级锁

在innodb中只有利用索引的更新,删除操作,才可以使用行级锁。

同时在navicat中打开两个窗口,SQL语句如下:

在窗口1中执行begin开启事物,然后执行update操作,先不执行commit。

然后切换到窗口2中,执行begin开启事物,然后执行update操作。

此时发现窗口2中的update是可以执行的,没有因为窗口1中的事物没有提交而等待。说明用到的是行级锁。

表级锁

在innodb中,不能使用索引的写操作则是表锁。

修改表设计,把ID的主键去掉,此时ID字段就没有索引了。

去掉主键后,点击保存按钮。

下面进行SQL演示,打开两个命令窗口,操作如下:

在窗口1中执行begin开启事物,然后执行update操作,先不执行commit。

然后切换到窗口2中,执行begin开启事物,然后执行update操作。

此时可以看到,update操作一直处于阻塞状态,没有完成。

切回窗口1,执行commit命令。

执行完毕,切换到窗口2,此时update语句才执行完成

由此可以看出,当窗口1的事物没有提交时,窗口2的更新操作一直处于阻塞状态,虽然窗口2更新的记录与窗口1更新的记录不是同一条。也就说明,当写操作时,未使用索引的操作则是表锁。

相关推荐
老华带你飞6 小时前
汽车销售|汽车报价|基于Java汽车销售系统(源码+数据库+文档)
java·开发语言·数据库·vue.js·spring boot·后端·汽车
黑客思维者6 小时前
数据库连接池的并发控制与超时处理:从参数调优到动态适配
数据库
Chloeis Syntax6 小时前
MySQL初阶学习日记(4)--- 插入、聚合、分组查询 + 数据库约束
数据库·笔记·学习·mysql
西岭千秋雪_7 小时前
MySQL集群搭建
java·数据库·分布式·mysql
马克学长7 小时前
SSM实验室预约管理系统5x7en(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·实验室预约管理系统·ssm 框架
古城小栈7 小时前
MySQL 配置优化 绿皮书
数据库·mysql
向葭奔赴♡8 小时前
若依数据权限实现全流程解析
数据库
不许赖zhang8 小时前
navicat免安装 navicat12 适配win10、win11
数据库
箬敏伊儿8 小时前
Apple M2 + Docker + MySQL 轻量配置全教程
数据库·mysql·docker