美文网首页Mysql
InnoDB行锁升级为表锁的问题

InnoDB行锁升级为表锁的问题

作者: 我叫于牛逼 | 来源:发表于2020-03-25 14:55 被阅读0次

    前几天跟朋友聊天,聊起Mysql锁的问题。他突然问我为什么行锁会变成表锁。
    由于解释半天,他还没搞明白,因此用图形化界面给他演示一下

    首先准备一张简单的测试表

    0F3B30CAA2525949EFA66E4EAC001A32.jpg

    准备两个窗体,且同时开启事务


    77AA6BF61F044740E9091656B4178740.jpg
    
    Session 1
    begin;
    select * from t1 where name = '张三' for update;
    
    ROLLBACK
    COMMIT
    
    /****************************************************************************/
    Session 2
    begin;
    select * from t1 where id = 3 for update;
    
    ROLLBACK
    COMMIT
    
    

    session2 因为行锁升级为表锁一直在等待

    InnoDB 行级锁是通过给索引上的索引项加锁来实现的,InnoDB行级锁只有通过索引条件检索数据,才使用行级锁;否则,InnoDB使用表锁 在不通过索引(主 键)条件查询的时候,InnoDB是表锁而不是行锁。

    总结:就是在没有使用索引的情况下InnoDB就会使用表级锁(共享锁不会有这个情况)

    最后给出事务使用的几点建议

    • 控制事务大小,减少锁定的资源量和锁定时间长度。
    • 所有的数据检索都通过索引来完成,从而避免因为无法通过索引加锁而升级为表锁。
    • 减少基于范围的数据检索过滤条件,避免因为间隙锁带来的负面影响而锁定了不该锁定的数据。
    • 在业务条件允许下,尽量使用较低隔离级别的事务隔离。减少隔离级别带来的附加成本。
    • 合理使用索引,让innodb在索引上面加锁的时候更加准确。
    • 在应用中尽可能做到访问的顺序执行。
    • 如果容易死锁,就可以考虑使用表锁来减少死锁的概率

    相关文章

      网友评论

        本文标题:InnoDB行锁升级为表锁的问题

        本文链接:https://www.haomeiwen.com/subject/wogfpxtx.html