Silentdoer

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

select for update在springboot里实现分布式锁

// mapper,注意,这里的参数最好就是主键或者唯一键,否则产生的是表锁,script可以省略
@Select("<script> select* from foo where id = #{id} for update</script>")
Foo selectForUpdateById(@Param("id") Long id);


// service,必须加事物,否则selectForUpdateById无法实现分布式锁的作用
@Transactional(rollbackFor = Exception.class, propagation = Propatation.REQUIRED)
public void test() {
    log.info("任意进程都能同时到这里来");
    Foo foo = mapper.selectForUpdateById("存在的id");
    // 这里开始是临界区,只能有一个进程进来;
    assert foo != null;
    // 这里可以执行对Foo的某条记录的update操作,version = version + 1 where uniq_key = #{...}
    log.info("只有获得了'分布式锁'的进程能到这里来,执行完毕commit后会释放分布式锁,是commit而非线程结束");
}

 

作者:Silentdoer
欢迎任何形式的转载,但请务必注明出处。
限于本人水平,如果随笔/文章及代码有表述不当之处,还请不吝赐教。

posted on   Silentdoer  阅读(291)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗
点击右上角即可分享
微信分享提示