zoukankan      html  css  js  c++  java
  • Mysql 锁

    锁分类

    • 行锁
    • 间隙锁
    • 表锁

    行锁(锁原理是基于索引的,如果不命中索引就会升级为表锁,注意Innodb存储引擎)

    1、查自动提交是否关闭

    命令行打开两个窗口,窗口1关闭自动提交
    show variables like 'autocommit';
    --关闭自动提交
    set autocommit=0;
    select * from user;
    +----+--------+--------+
    | id | xuehao | name   |
    +----+--------+--------+
    |  1 | 110    | stu1    |
    |  2 | 111    | stu10 |
    | 12 | 112    | stu20    |
    +----+--------+--------+
    在窗口1中更新一行数据,执行如下语句:
    start transaction;
    begin;
    update user set name='stu2' where id=1;
    执行完,打开窗口2,也来更新该记录,发现SQL不能执行
    update user set name='stu3' where id=1;
    这是时在窗口1手动提交事务,执行commit,在切换回窗口2发现SQL被执行。
    

    2、表锁

    思路:xuehao列没有索引,根据学号列更新,测试升级为表锁。
    窗口1中,
    set autocommit=0;
    start transaction;
    begin;
    update user set name='stu2' where xuehao='110';
    窗口2,执行SQL会被卡主
    update user set name='stu2' where xuehao='112';
    最后,切到窗口1,提交事务commit;窗口2的SQL才会执行。
    

    3、间隙锁
    事务隔离级别:可重复读,当保证范围查询,事务内不可变,需要间隙锁。
    间隙锁,查询对应的条件列上没有索引或者非唯一索引,间隙锁是左开右闭的。

    总结:
    注意行锁,在innodb引擎下,命中索引才会有;
    生产注意不要行锁变表锁,并发性查;
    间隙锁,会产生死锁。

  • 相关阅读:
    Extjs renderer函数
    孩子,教育,钱
    《新概念英语》的学习方法
    英语,想说爱你爱的太晚
    window.open模拟表单POST提交
    Extjs 解决grid分页bug问题
    Extjs 判断对象是非为null或者为空字符串
    linux shell 删除满足正则表达式的文件
    OpenCV 生成矩形mask
    测试Kaggle kernel commit 是否会删除以前的output
  • 原文地址:https://www.cnblogs.com/xingrui/p/13499667.html
Copyright © 2011-2022 走看看