zoukankan      html  css  js  c++  java
  • mysql 共享排他锁

      1、基础知识

        共享锁又叫S锁(Share Locks),共享锁就是多个事务对于同一数据可以共享一把锁,都能访问到数据,但是只能读不能修改。

        排他锁又叫X锁(eXclusive Locks,记为X锁),排他锁就是不能与其他锁并存,只有等待锁释放完成以后其他事务才能得到锁。

        下面是共享锁与排他锁的互斥关系 

               S          X

        S      兼容      互斥

        X      互斥      互斥

      2、练习题

      有autoid表数据如下

      

       a、共享锁(select  ...... lock in share mode;)

    SessionA SessionB
    begin;  
    select * from test.autoid WHERE id=1 lock in share mode; begin;
      UPDATE test.autoid SET `name`="xxxx" WHERE id=1;
      锁超时

                                      (图A)

    SessionA SessionB
    begin; begin;
    select * from test.autoid WHERE id=1 lock in share mode; select * from test.autoid WHERE id=1 lock in share mode;
    有数据     有数据

                                        (图B)

        可以从上图(A)中看到,因为事务A对数据1加上了共享锁,并且当时事务A的锁并没有进行释放,所以事务B对数据进行更新操作的时候是不可以进行操作的。在图B当中我们可以看到,当事务A对数据进行了加锁,这个时候事务B是可以读取数据的,不需要进行阻塞。但是如果这个时候事务A对数据进行了更改,并且事务没有提交的情况下,那么这个时候事务B读取的数据会是旧数据而不是新数据。由此可以看出,共享锁是:读读可以并行;

      b、排他锁(select   ......  for  update;)

    sessionA sessionB
    begin;  
    select * from test.autoid WHERE id=1 for update; begin;
      select * from test.autoid WHERE id=1 for update;
      阻塞,等待A事务执行

        从上图可以看到,对数据加上了排他锁以后,即使事务B是对事务A进行读取操作也是无法进行了,这也正应正了刚才所说的,排他锁与其他锁是互斥的,排他锁:写写/读写必须互斥;

      

  • 相关阅读:
    C语言与汇编的嵌入式编程:统计字符串中各字符出现的次数
    一个汇编小demo
    C语言与汇编的嵌入式编程:求100以内素数
    TCP网络调试助手上提示错误:“1035 未知错误”的有效解决方法,本人实测确实可行
    一个支持国密SM2/SM3/SM4/SM9/ZUC/SSL的密码工具箱
    DRM(device resource management)介绍
    TODO
    pinctrl(1)——pinctrl子系统的使用
    GPIO使用总结
    Gerrit使用技巧
  • 原文地址:https://www.cnblogs.com/zhaoyongjie-z/p/12433815.html
Copyright © 2011-2022 走看看