刚用 mongodb,请教下类似 MySQL 的「select ... for update」大伙都是如何替代?

2023-07-23 20:52:16 +08:00
 Haujilo

最近开始用 mongodb ,发现也有事务的概念了。

不过有些业务代码有在多线程下访问 MySQL 的场景时,更新数据会用 select ... for update 锁行,比如常见的锁个订单,然后调用外部接口后修改状态,失败的时候回滚数据,此时其他的线程访问都是阻塞住的。

用 MongoDB 的话,是否原生指令就可以实现同样的效果(好像没搜到)?是必须得额外搞个分布式锁来?

2427 次点击
所在节点    MongoDB
9 条回复
roundgis
2023-07-23 20:59:06 +08:00
find_and_modify 之類
rrfeng
2023-07-23 21:06:20 +08:00
MongoDB 支持事务你这个问题不是问题?
Haujilo
2023-07-23 21:28:16 +08:00
@rrfeng 但是文档里写的,好像是保障两个 document 修改要么发生,要么不发生。好像没有显示加锁的过程和阻塞的过程?比如我在一个事务 commit 里 sleep 十分钟,另一个事务发起似乎是会执行完的?
Haujilo
2023-07-23 21:28:51 +08:00
@roundgis 但是这个似乎没有阻塞的效果?
homolabby
2023-07-23 21:59:20 +08:00
我记得 mongoDB 隔离级别是可重复读,select for update 会查看到 readview 之外的东西,相当于隔离级别回到了读已提交级别。
LandCruiser
2023-07-23 22:27:00 +08:00
mongodb 最新版本才刚加入了锁的概念,以前没有锁的概念,这个你得去看文档了,会的人不多
yu8403723
2023-07-24 16:02:18 +08:00
次元大陆吗
dumbbell5kg
2023-07-24 18:32:59 +08:00
mongo 事务用的是乐观锁,不会阻塞线程,想阻塞可以额外加分布式
dumbbell5kg
2023-07-24 18:33:20 +08:00

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/959031

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX