Mysql 中 select ... for update 加锁总结

新建一张表

复制代码
CREATE TABLE `stu` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  `code` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `idx_age` (`age`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1570068 DEFAULT CHARSET=utf8;

id 为主键, name和code为普通字段, age为索引字段.

插入两条测试数据如下:

(1) 以主键字段作为条件上锁

开启事物A 以id字段作为条件上锁, 操作如下

事务B执行更新 1001这条记录

操作超时更新失败.

而更新 1009 这条记录成功.

说明 以主键字段作为条件上锁,锁的是行,是表中查询命中的数据.

(2) 以索引字段作为条件上锁

开启事物A 以 age 字段作为条件上锁, 操作如下

事务B执行更新 1001这条记录

操作超时报错.

更新 1009 这条记录, 更新成功

说明和(1)一样, 以索引字段作为条件上锁, 锁住的是行, 是表中查询命中的数据.

(3) 以普通字段作为条件上锁

开启事物A, 以name字段为条件加锁

事物B更新 1001这条记录, 超时失败

再更新 1009 这条, 也是超时失败

说明, 以普通字段作为条件上锁, 锁的是表, 是表中的所有数据.

以下是三种情况的总结:

(1) 以主键字段作为条件上锁,锁的是行,是表中查询命中的数据

(2) 以索引字段作为条件上锁,锁的是行,是表中查询命中的数据

(3) 以普通字段作为条件上锁, 锁的是该表, 是表中的所有数据


and 和 or 组合条件

说明:

显示sql更新操作超时时间以及如何修改

在Navicat 中可以执行

show VARIABLES like 'innodb_lock_wait_timeout'; 显示更新操作超时时间

set innodb_lock_wait_timeout = 10; 可以修改超时时间, 单位是秒. 但是但是注意这种临时修改的方法只会在当前会话(也就是Navicat的一个查询) 中生效.

相关推荐
Bazingga7 小时前
Java16 record 完整拆解——语法、语义、限制、反射
java·后端
SL_staff8 小时前
规则联动:给工厂装上‘自动化神经反射弧’——JVS·物联网平台规则引擎实战教程
java·人工智能·物联网
骑着蜗牛撵大象3278 小时前
Linux 进程间通信之管道:从 pipe() 的内核语义到 FIFO 落地排错
android·java·linux·系统编程·fifo·管道·进程间通信
WJ.Polar9 小时前
Java封装、继承、多态
java·开发语言
ly76899 小时前
PostgreSQL 备份恢复策略:pg_basebackup、WAL 归档与 PITR 在企业 Java 系统中的落地
java·数据库·postgresql·pitr·pg_basebackup·wal 归档
摇滚侠9 小时前
Java 中如何表示负数,有符号和无符号的区别,补码的计算规则,char byte short int long 的范围
java·开发语言
奇牙coding9 小时前
Codex CLI 升级后多文件编辑静默失效:config.yaml 枚举变更排查与修复指南
java·前端·javascript·ai
小羊没烦恼!9 小时前
Ajax与JSON的一些总结
android·java·前端·数据库·mysql·算法·okhttp
注塑机数据采集联网9 小时前
如何解决注塑机数据采集联网对接MES系统数据WiFi传输数据不稳问题
大数据·数据库·物联网·数据挖掘·数据分析
Lhappy嘻嘻9 小时前
读懂 JVM:内存模型、类加载机制、分代回收
java·开发语言·jvm