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 @   二娃的园子  阅读(250)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程
点击右上角即可分享
微信分享提示