最新要闻

广告

手机

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

家电

新资讯:MySQL间隙锁、行锁的读写阻塞实验

来源:博客园


【资料图】

目录
  • 结论
  • 实验过程

结论

普通查询查询(加共享锁)查询(加排它锁)插入/更新
间隙锁不阻塞不阻塞不阻塞阻塞
行锁不阻塞阻塞阻塞阻塞

MySQL版本:5.7.26

实验过程

  1. 写一个程序模拟实际代码:
@SneakyThrows@Transactionalpublic 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";}
  1. TestTable表结构及数据:
  • 启用一个线程调用1.中方法查询username:233
  • 启用一个线程调用1.中方法查询username:2334以上两个线程都会在(1)处阻塞。

此时用数据库管理工具去查询一下这两条数据:

  1. 使用普通查询语句:select * from test_table where username =

    • 查询233不会阻塞
    • 查询2334不会阻塞
  2. 使用lock in share mode查询语句:select * from test_table where username = lock in share mode

    • 查询233会阻塞
    • 查询2334不会阻塞
  3. 使用for update查询语句:select * from test_table where username = for update

    • 查询233会阻塞
    • 查询2334不会阻塞
  4. 插入2334:会阻塞

关键词: 查询语句 管理工具