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引擎下,命中索引才会有;
    生产注意不要行锁变表锁,并发性查;
    间隙锁,会产生死锁。

  • 相关阅读:
    require的特点
    require和load的不同之处
    关于“load”方法
    puts方法要点
    用类解释对象的由来
    以方法调用的原理解释Ruby中“puts ‘Hello‘”
    Ruby中方法的设计理念
    Ruby中puts,print,p的区别
    Ubuntu16.04安装MongoDB的Ruby驱动
    使用spring框架,用xml方式进行bean装配出现“The fully qualified name of the bean's class, except if it serves...”
  • 原文地址:https://www.cnblogs.com/xingrui/p/13499667.html
Copyright © 2011-2022 走看看