MySQL之悲观锁(select lock in share mode)的使用

悲观锁按照使用的性质可以划分为共享锁(Share Lock)和排他锁(Exclusive Lock)。
关于排他锁的使用,可以见另一篇博客MySQL之悲观锁(select for update)的使用,本文主要介绍共享锁的使用。

共享锁(Share Lock)

S锁,又称读锁,用于所有的只读数据操作。共享锁是非独占的,允许多个并发事务读取其锁定的资源。

性质: 1,多个事务可以封锁同一个共享页。 2,任何事物都不能修改该页。 3,通常该页被读取完毕后,S锁会被立即释放。

允许不同事务之前共享加锁读取,但不允许其他事务修改或者加入排他锁。
如果有修改必须等待一个事务提交完成,才可以执行,容易出现死锁。

例如:

select * from books where book_id = 7 lock in share mode;

共享事务锁之间的读取

sesison 1:

start transaction;
select * from books where book_id = 7 lock in share mode;

在这里插入图片描述
session 2:

start transaction;
select * from books where book_id = 7 lock in share mode;

在这里插入图片描述
此时,两个会话均能正常的查询到数据。
session 3:

start transaction;
select * from books where book_id = 7 for update;

在这里插入图片描述
此时进入了等待的状态。返回如下错误:

1205 - Lock wait timeout exceeded; try restarting transaction, Time: 51.019000s

共享锁之间的更新

当session1 执行了修改语句:
sesison 1:
update books set name = “H5” where book_id = 22;

在这里插入图片描述
进入等待状态。。
session 2中执行相同的SQL,提示死锁,显示如下错误:

1213 - Deadlock found when trying to get lock; try restarting transaction, Time: 0.078000s

只有session1执行了commit操作,才会释放S锁,session2才能执行update操作。
若多个session并发执行,出现死锁的概率将大大增加。

总结

MySQL 共享锁(lock in share mode)

  • 允许其他事务也增加共享锁读取
  • 不允许其他事务增加排他锁(for update)
  • 当事务同时增加共享锁时,事务的更新操作必须等待先执行的事务commit后才能执行,如果同时并发太大的时候很容易造成死锁。
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值