简单聊下,悲观锁 select * for update 的用法

6 篇文章 0 订阅
6 篇文章 0 订阅

在项目的开发中,我们肯定会用到锁机制来解决并发的问题, 其中被大家广为应用的有:

  • synchronized
  • java.util.concurrent.locks.ReentrantReadWriteLock
  • java.util.concurrent.locks.Lock 系列
  • Mysql 的乐观锁,悲观锁
  • 等等

下面,我将介绍的锁是:【悲观锁 select * for update】

1. 使用

在这里插入图片描述
上图是我所使用的列子, 首先一个方法中有一个查询语句findSequence, 和一个更新语句updateSequence。
其中在查询语句中使用悲观锁:

SELECT * FROM ke_sequence WHERE id = #{id} FOR UPDATE

而更新语句只是平常的update语句:

UPDATE ke_sequence SET sequence = sequence +1 WHERE id = #{id} AND sequence= #{sequence}

2. 注意事项

  1. 该方法必须在事物中,可以使用@Transactional;
  2. 在select for update查询中必须使用id主键作为条件,否则使用不当,容易造成全表被锁住。
  3. 如果有多个方法都使用了悲观锁,且都是对相同的几个表进行加锁,必须注意加锁的顺序问题,否则容易造成死锁。

3. 什么时候释放锁?

  1. 该语句的事务被commit语句或rollback
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值