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进行读取操作也是无法进行了,这也正应正了刚才所说的,排他锁与其他锁是互斥的,排他锁:写写/读写必须互斥;

      

  • 相关阅读:
    搭建本地源
    shell中tar加密打包
    mysql出现ERROR 1819 (HY000)的解决方法
    mysql 创建用户及授权(2)
    mysql 创建用户及授权(1)
    Redis 工具 redis-port 使用
    mysql中 drop、truncate和delete的区别
    dlerror和dlclose用法
    dlsym用法
    dlopen用法
  • 原文地址:https://www.cnblogs.com/zhaoyongjie-z/p/12433815.html
Copyright © 2011-2022 走看看