MySQL间隙锁、行锁的读写阻塞实验
结论
普通查询 | 查询(加共享锁) | 查询(加排它锁) | 插入/更新 | |
---|---|---|---|---|
间隙锁 | 不阻塞 | 不阻塞 | 不阻塞 | 阻塞 |
行锁 | 不阻塞 | 阻塞 | 阻塞 | 阻塞 |
MySQL版本:5.7.26
实验过程
- 写一个程序模拟实际代码:
@SneakyThrows @Transactional public String testPessimisticWrite(String username) { log.info("start query"); // select * where testtable0_.username=:username for update; TestTable testTable1 = testTableDao.findPessimisticWriteByUsername(username).orElse(null); log.info("finished query" + testTable1); // (1) TimeUnit.SECONDS.sleep(6000); return "ok"; }
- TestTable表结构及数据:
- 启用一个线程调用
1.
中方法查询username:233
- 启用一个线程调用
1.
中方法查询username:2334
以上两个线程都会在(1)
处阻塞。
此时用数据库管理工具去查询一下这两条数据:
-
使用普通查询语句:
select * from test_table where username = <username>
- 查询
233
不会阻塞 - 查询
2334
不会阻塞
- 查询
-
使用
lock in share mode
查询语句:select * from test_table where username = <username> lock in share mode
- 查询
233
会阻塞 - 查询
2334
不会阻塞
- 查询
-
使用
for update
查询语句:select * from test_table where username = <username> for update
- 查询
233
会阻塞 - 查询
2334
不会阻塞
- 查询
-
插入
2334
:会阻塞
标签:
数据库
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)