Java 的锁机制,是不是只能在确认只会部署一台机器的前提下使用?

2021-08-30 16:13:30 +08:00
 shadowfish0

有一个需求,需要在数据库插入数据,但是要求不能和之前的记录重复,因为这个重复判定还需要计算时间,不能直接做成唯一索引,因此就需要用锁机制来搞定,这里就有个疑惑了

如果用 mysql 的锁机制,把 select 和 insert 放在一个事务里,那应该必须只能串行化处理,整个表都被锁了

如果用 java 的 synchronized()机制,应该可以做到在进行这个处理的过程中不会锁整张表。但是就有个问题,如果要做多机部署搞负载均衡,那 java 层面的锁不就没用了白做了吗

然后就引申出,java 的锁机制,是不是只能在确认只会部署一台机器的前提下使用?

1218 次点击
所在节点    问与答
8 条回复
dilu
2021-08-30 16:22:20 +08:00
单个机器,直接本地锁,例如互斥锁 即可

多个机器,要用分布式锁,例如 redis
dqzcwxb
2021-08-30 16:22:58 +08:00
SuperManNoPain
2021-08-30 16:24:07 +08:00
cheng6563
2021-08-30 16:28:46 +08:00

分布式锁的话,不想加 redis 之类的组件可以直接在数据库建个表利用事务来做。
keepeye
2021-08-30 17:24:21 +08:00
mysql 事物用 select ... for update 语句,条件合适的话应该是行锁吧

脱离 mysql 的话,只能考虑分布式锁啦
Senorsen
2021-08-30 21:33:54 +08:00
Java 的锁机制主要是为了本地多线程资源共享问题。
你这需求就得用分布式锁
xilou31
2021-08-31 11:41:02 +08:00
你想要用多机器就需要用分布式锁
sakasaka
2021-09-02 14:12:22 +08:00
synchronized 是基于 JVM 虚拟机的

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

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

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

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

© 2021 V2EX