浅谈一下MySql中的锁


活动地址:CSDN21天学习挑战赛

一.共享锁和排他锁

读读共享,读写互斥,写写互斥
共享锁又称之为读锁,简称s锁,鸡多个事务对于同一数据可以共享一把锁,都能访问到数据,但是不能修改。
排他锁又称为写锁,简称x锁,排他锁就是不能与其他锁并存,如一个事务获取了一个数据行的排他锁,其他事务就不能再获取该行的其他锁,包括共享发锁和排他锁,但是获取排他锁的事务可以对数据就行读取和修改。
常⻅的⼏种 SQL 语句的加锁情况如下:

select * from table; #不加锁
update/insert/delete #排他锁
select * from table where id = 1 for update; #id为索引,加排他锁
select * from table where id = 1 lock in share mode; #id为索引,加共享锁

数据库的⾏锁和表锁

⾏锁:操作时只锁某⼀(些)⾏,不对其它⾏有影响。开销⼤,加锁慢;会出现死锁;锁定粒度⼩,发⽣锁冲突的概率低,并发度⾼。

表锁:即使操作⼀条记录也会锁住整个表。开销⼩,加锁快;不会出现死锁;锁定粒度⼤,发⽣锁冲突概率⾼,并发度最低。

⻚锁:操作时锁住⼀⻚数据(16kb)。开销和加锁速度介于表锁和⾏锁之间;会出现死锁;锁定粒度介于表锁和⾏锁之间,并发度⼀般。

⾏锁是怎么实现的

InnoDB ⾏锁是通过索引上的索引项来实现的。意味者:只有通过索引条件检索数据,InnoDB 才会使⽤⾏级锁,否则,InnoDB将使⽤表锁!
对于主键索引:直接锁住锁住主键索引即可。
对于普通索引:先锁住普通索引,接着锁住主键索引,这是因为⼀张表的索引可能存在多个,通过主键索引才能确保锁是唯⼀的,不然如果同时有2个事务对同1条数据的不同索引分别加锁,那就可能存在2个事务同时操作⼀条数据了。

乐观锁和悲观锁

悲观锁:当要对数据库中的一条数据进行修改的时候,为了避免同时被其他人修改,最好的办法就是直接对该 数据进行加锁以防止并发问题。
悲观锁优点:数据更加安全,不容易出现并发问题 悲观锁缺点:高并发时对性能较大,而且可能出现死锁现象。

乐观锁:乐观锁是相对悲观锁而言的,乐观锁假设数据一般情况不会造成冲突,所以在数据进行提交更新的时 候,才会正式对数据的冲突与否进行检测,如果冲突,则返回给用户异常信息,让用户决定如何去做。乐观锁 适用于读多写少的场景,这样可以提高程序的吞吐量。

MySQL 如何实现悲观锁和乐观锁?

乐观锁:更新时带上版本号(cas更新)
悲观锁:使⽤共享锁和排它锁,select…lock in share mode,select

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值