常问 3: 谈谈MySQL共享锁与排他锁

https://blog.csdn.net/localhost01/article/details/78720727

https://blog.csdn.net/c466254931/article/details/53463596

https://www.cnblogs.com/zhanht/p/5431273.html

https://www.cnblogs.com/liaoweipeng/p/7615959.html

锁的基本概念
  当多事务争取一个资源时,有可能导致数据不一致,这个时候需要一种机制限制,并且将数据访问顺序化,用来保证数据库数据的一致性,锁就是其中的一种机制。我们可以用商场的试衣间来做个比喻,商场里得每个试衣间都可供多个消费者使用,因此可能出现多个消费者同时试衣服需要使用试衣间,这时候就产生冲突了,为了避免冲突,试衣间装了锁(其实就是进去之后把门拴住),某一个试衣服的人在试衣间里把锁锁住了,其他顾客就不能再从外面打开了,只能等待里面的顾客,试完衣服,从里面把锁打开,外面的人才能进去(网上找到的比喻,非常形象)。不过我想要是并发了就尴尬了,哈哈。

行级锁 行级锁–>分为共享锁和排他锁

行级锁是Mysql中锁定粒度最细的一种锁,能大大减少数据库操作的冲突,
由于其粒度小,加锁的开销最大。

MySQL主要的两种锁的特性可大致归纳如下:
 表级锁: 开销小,加锁快;不会出现死锁(因为MyISAM会一次性获得SQL所需的全部锁);
锁定粒度大,发生锁冲突的概率最高,并发度最低。
 行级锁: 开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高

MyIsam -----》只支持表级锁

Innodb -----》InnoDB存储引擎既支持行级锁( row-level locking),也支持表级锁,但默认情况下是采用行级锁。

共享锁又称为读锁,简称S锁
顾名思义,共享锁就是多个事务对于同一数据可以共享一把锁,都能访问到数据,但是只能读不能修改。

排他锁又称为写锁,简称X锁
顾名思义,排他锁就是不能与其他所并存,如一个事务获取了一个数据行的排他锁其他事务就不能再获取该行的其他锁,包括共享锁和排他锁,但是获取排他锁的事务是可以对数据就行读取和修改。排他锁指的是一个事务在一行数据加上排他锁后,其他事务不能再在其上加其他的锁

mysql InnoDB引擎默认的修改数据语句,
update,delete,insert都会自动给涉及到的数据加上排他锁,
select语句默认不会加任何锁类型,如果加排他锁可以使用select…for update语句,
加共享锁可以使用select … lock in share mode语句。

  1. 所以加过排他锁的数据行在其他事务种是不能修改数据的, 也不能通过for update和lock in share
    mode锁的方式查询数据, 但可以直接通过select …from…查询数据,因为普通查询没有任何锁机制。

下面做实验验证上面的结论

show VARIABLES like 'autocommit';

在这里插入图片描述
设置自动提交事务为否

set  autocommit = 0;

在这里插入图片描述

在这里插入图片描述
执行事务提交

COMMIT ;

在这里插入图片描述

结论:也就是说,Innodb存储引擎执行数据 update时候,会加上排他锁,这时候,执行 update ,delete ,insert , 或者 select select…for update 和 select … lock in share mode 都会发生阻塞,但是执行 select * from table 是不会阻塞的。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值