• mysql行锁,表锁,间隙锁


    我们在使用数据库的过程中在处理有关金额方面的数据时可能会使用到锁的知识,下面我来给大家演示一下数据库锁的使用

    首先我们知道数据库默认是自动提交事务

    SET autocommit=0是关闭自动提交

    SET autocommit=1是开启自动提交,默认是开启的

    我们先关闭自动提交,表a如下

     我们执行UPDATE a set name='a3' where id=4

    执行之后我们SELECT * FROM `a`

    然后在打开另一个临时会话

    这时候我们看到解决是不同的,这是因为我们没有提交事务,防止脏读的发生

    然后我们commit一下

    这时候我们就能看到会话2就可以看到了

    接下来我们在会话2执行一下修改方法

    我们在会话一执行UPDATE a set name='a3' where id=4

    会话2执行UPDATE a set name='a4' where id=4

    这时候可以看到会话2是在处于等待操作

    这时候我们执行会话1的commit

    我们看到会话2执行成功,并且一直在等到执行

    这就是产生了一个行锁的竞争

    那么什么是表锁呢.表锁是锁住了整个数据表操作,通常发生的场景是在使用条件时加了or作为链接,会产生一个表的锁

    比如我们在会话一执行UPDATE a set name='a3' where id=4 or id=5

    会话2执行UPDATE a set name='a4' where id=6会锁住就像行锁一样必须等待会话一执行完毕

    那么什么是间隙锁呢,你如现在我们是id1 3  5  7 的话

    我们会话1执行一个update a set name='a4' where id>1 and id<7的数据

     会话2 insert into a values(4,'b6')插入id为4的数据,我们可以看到id并没有4的数据但是因为会话一没有结束,我们也是不会执行操作的

    范围锁的灾难性也是比较大的,如果我们表锁住一万行数据,我们就不能操作这一万行数据了

    最后我们可以使用show status like 'innodb row lock%'来查看一个数据库的性能和锁的使用情况


    show status like 'innodb_row_lock%';
     
    对于各个状态说明如下:
    Innodb_row_lock_current_waits:当前正在等待锁的数量;
    Innodb_row_lock_time:从系统启动到现在锁定总时间长度;
    Innodb_row_lock_time_avg:每次等待所花平均时间;
    Innodb_row_lock_time_max:从系统启动到现在等待最长的一次所花的时间长度;
    Innodb_row_lock_waits:系统启动到现在总共等待的次数;
     

  • 相关阅读:
    达梦数据库常用参数查询
    中国安全防护罩行业发展态势与应用前景预测报告2022-2028年
    BUG解决Button类不能从UnityEngine.UI中引用
    RocketMQ学习笔记一
    从今天起真正释放创造力 | Werner Vogels 在 re:Invent 2022带来多项开发者福音
    ideal一键部署SpringBoot项目jar包到服务器
    ruoyi框架使用自定义用户表登录
    vue安装依赖报错install i 报错提示npm audit fix --force,or `npm audit` for details
    MySQL之InnoDB锁机制
    LVGL_基础控件dropdown
  • 原文地址:https://blog.csdn.net/Theshy08/article/details/126690658