zoukankan      html  css  js  c++  java
  • 关于MYSQL 查询时使用 FOR UPDATE 行锁还是表锁问题

    测试表

    CREATE TABLE `user` (
      `id` bigint(20) NOT NULL AUTO_INCREMENT,
      `username` varchar(255) DEFAULT NULL,
      `password` varchar(255) DEFAULT NULL,
      PRIMARY KEY (`id`) USING BTREE,
      KEY `u_name_uq` (`username`) USING BTREE
    ) ENGINE=InnoDB;
    
    INSERT INTO `mh_1112`.`user`(`id`, `username`, `password`) VALUES (1, 'zhangsan', '123456');
    INSERT INTO `mh_1112`.`user`(`id`, `username`, `password`) VALUES (2, 'zhangsi', 'abc456');
    INSERT INTO `mh_1112`.`user`(`id`, `username`, `password`) VALUES (3, 'lisan', '123654');
    

    测试1:用主键查询时是行锁:

    窗口1查询id=1时,窗口2查询id=2时可以查询,查询id=1时会卡在那等待窗口1完成事务。
    image
    窗口1提交事务,窗口2就可以查出id=1的结果了
    image

    测试2:使用索引查询时也是行锁,锁的是查到的行

    当窗口1根据username索引查询到id=1和2的结果时,窗口2查询id=3时可以查询,查询id=1和2时会卡住,等待窗口1的事务完成。
    image
    当窗口1提交或回滚事务时,窗口2卡住的查询就出现结果了。
    image

    测试3:当索引失效或者是不使用索引时:锁的是表

    索引失效

    当使用like + %开头的查询时索引失效,窗口1查出id=1和3的数据,窗口2查询id=2的数据会卡住,说明整个表都被锁了。
    image
    窗口1完成事务,窗口2出现结果:
    image

    不使用索引

    窗口1不适用任何索引查询id=1的结果,窗口2查询id=2的结果会卡住,说明还是表锁
    image
    image

    结论

    在开启事务的情况下,查询使用FOR UPDATE,如果使用了索引(主键)并且索引生效的情况下,锁的是查到的行,否则是表锁。

  • 相关阅读:
    POJ 1321 棋盘问题
    POJ3468 A Simple Problem with Integers(区间更新+区间查询+差分)
    洛谷P3374【模板】树状数组 1(单点更新+区间求和)
    Lake Counting
    柱状图统计
    数据库读取
    c作图-正弦函数图像
    Fence Repair
    Stall Reservations(贪心+优先队列)
    Table Tennis Game 2
  • 原文地址:https://www.cnblogs.com/mjtabu/p/15745936.html
Copyright © 2011-2022 走看看