PostgreSQL: select for update实战
场景
需要获取用户申请的流水号,其值记录在number_of_form
表中。但当多个用户同时申请时,会出现单号重复的情况,现在需要保证单据号码的一致性
解决方案
以我搜寻来看,大体有两种做法。
-
悲观锁:总是假设最坏的情况,也就是每次拿数据的时候,都认为别人会修改,所以每次拿数据,都会对符合条件的数据进行加锁。
-
乐观锁: 不会对符合条件的数据进行加锁,但在写入之前,会对数据进行一次校验。看获取的数据和在数据库中的数据是否一致。
实际做法(选择悲观锁)
窗口1
SELECT *
FROM number_of_form
WHERE year = '24'
AND month = '02' FOR UPDATE;
UPDATE number_of_form
SET number=3
WHERE uuid = {{your_uuid}};
另外需要注意的是,我再DataGrip中,将提交设置为了手动。这样才能在执行的时候,触发另一个语句。
此时,数据如下所示
同步进行
窗口2
UPDATE number_of_form SET number=(
SELECT number + 1 as number from number_of_form WHERE year = '24'
AND month = '02' FOR UPDATE
)WHERE uuid='{{your_uuid}}';
执行如上语句,语句会处在加载的状态。
回到第一条语句的编辑器,按下提交按钮。
此时窗口2会完成写入语句。其结果如下所示
执行成功
参考链接
https://zhuanlan.zhihu.com/p/626926704
https://segmentfault.com/a/1190000023045909
关于阻塞
https://blog.csdn.net/u014240299/article/details/120471319
https://blog.csdn.net/weixin_33704234/article/details/86085336
学以致用,知行合一
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 推荐几款开源且免费的 .NET MAUI 组件库
· 实操Deepseek接入个人知识库
· 易语言 —— 开山篇
· 【全网最全教程】使用最强DeepSeekR1+联网的火山引擎,没有生成长度限制,DeepSeek本体