zoukankan      html  css  js  c++  java
  • mysql 开发进阶篇系列 9 锁问题 (Innodb 行锁实现方式)重点篇

    一.概述

      Innodb 行锁是通过给索引上的"索引项"加锁来实现的。这一点与(oracle,sql server)不同后者是通过在数据块中对相应的数据行加锁。这意味着只有通过索引条件检索数据,innodb才使用行级锁,否则 innodb将使用表锁
      在实际应用中,特别要注意innodb行锁的这一特性,不然的话,可能导致大量的锁冲突,从而影响并发性能。下面来实际演示说明:

      1.  innodb 的表条件CityCode不使用索引时,使用的是表锁例子

    -- 查询表中数据共二条
    SELECT * FROM  city;

    -- 条件字段CityCode不走索引
    EXPLAIN SELECT * FROM city WHERE CityCode='001'

    会话1

    会话2

    SET autocommit=0;

    SELECT * FROM  city WHERE CityCode='001';

    city_id      country_id        cityname CityCode

    14     2       深圳         001

    SET autocommit=0;

    SELECT * FROM  city WHERE CityCode='002';

    city_id      country_id        cityname CityCode

    15     2       长沙         002

    -- 加锁

    SELECT cityname FROM  city WHERE CityCode='001' FOR UPDATE ;

    cityname

    深圳

    -- 加锁

    SELECT cityname FROM  city WHERE CityCode='002' FOR UPDATE ;

    等待...

    错误代码: 1205

    Lock wait timeout exceeded; try restarting transaction

        通过上面的案例 会话1只给一行加了排它锁, 但会话2在请求其它行的排他锁时,却出现了锁等待。原因就是在没有索引的情况下,innodb只能使用表锁。

      2. innodb 的表条件CityCode使用索引时,使用的是行锁例子

    -- 添加索引
    ALTER TABLE city ADD INDEX ix_citycode(CityCode)
    -- CityCode走索引
    EXPLAIN SELECT * FROM city WHERE CityCode='001'

    会话1

    会话2

    SET autocommit=0;

    SELECT * FROM  city WHERE CityCode='001';

    city_id      country_id        cityname CityCode

    14     2       深圳         001

    SET autocommit=0;

    SELECT * FROM  city WHERE CityCode='002';

    city_id      country_id        cityname CityCode

    15     2       长沙         002

    -- 加锁

    SELECT cityname FROM  city WHERE CityCode='001' FOR UPDATE ;

    cityname

    深圳

    -- 加锁

    SELECT cityname FROM  city WHERE CityCode='002' FOR UPDATE ;

    cityname

    长沙

  • 相关阅读:
    抽奖概率算法
    thinkphp 6.0 结合 layuiadmin (iframe版)
    d2-admin 学习记录
    判断点是否在多边形区域内外
    PHP 优秀资源汇集
    前端学习路线
    限制sa 登录IP
    vs2013发布.net程序
    游标批 量删除数据表
    sql server2012 还原数据库
  • 原文地址:https://www.cnblogs.com/MrHSR/p/9376086.html
Copyright © 2011-2022 走看看