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

  

 

posted @ 2020-03-07 13:30  二娃的园子  阅读(249)  评论(0编辑  收藏  举报