mysql for update 锁_Mysql 行锁 for update

Mysql 只有Innodb支持行锁

使用行锁需要 事务支持

首先打开两个 mysql-client

分别执行

- client1

select * from my_entity1 for update;

- client2

select * from my_entity1 for update;

发现行锁无效,说明需要事务支持

- client1

start transaction;

select * from my_entity1 for update;

- client2

select * from my_entity1 for update;

这个时候 client2 阻塞等待锁

此时给client1 输入 commit; client2获得锁并且获取结果

如果client2 不加行锁也是不会被阻塞的

除此之外 forupdate还有其他方法

select * from t for update 会等待行锁释放之后,返回查询结果。

select * from t for update nowait 不等待行锁释放,提示锁冲突,不返回结果

select * from t for update wait 5 等待5秒,若行锁仍未释放,则提示锁冲突,不返回结果

select * from t for update skip locked 查询返回查询结果,但忽略有行锁的记录

Spring jpa 行锁

对调用的service 加 @Transaction注解

使用 @Query 原生sql注解

@Transactional

public void updateLockTester()

public interface Entity2Dao extends JpaRepository {

List findAllByTagEquals(Integer tag);

@Query(value = "select * from my_entity2 where tag = :tag for update", nativeQuery = true)

List findAllByTag2Equals(@Param("tag") Integer tag);

}

不能太过于依赖行锁,更建议使用分布式锁提高效率

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值