有条数据库字段,经常被不同地方修改,该怎么保证原子性?

2021-10-29 13:58:33 +08:00
 uiosun

每个玩家都有“金币”概念,假设它是一条数据库的数据

  1. 当玩家挂单,其他人买卖时,金币会修改;
  2. 当玩家打怪结算时,金币会修改;
  3. 当玩家工作结算时,金币会修改;
  4. 当玩家……

我现在加锁是:订单锁、打怪锁、工作结算锁,所以考虑后续如果类似的场景越来越多,该怎么优化? (生活系游戏,场景比较多样,估计金币的未来修改点,是不可避免的要扩大)

难道给所有金币的修改点都加个“金币锁”——锁中锁?

1276 次点击
所在节点    问与答
7 条回复
ihehe
2021-10-29 14:20:13 +08:00
为啥搞那么多锁,一个乐观锁就解决了
wunonglin
2021-10-29 14:24:50 +08:00
JoeBreeze
2021-10-29 14:26:34 +08:00
如果忽略数据延迟, 是否可以考虑用任务队列形式来操作数据

例如: 同时间发生 "打怪+发工资+自动扣款+交易入账", 每个事件创建一个任务加入到任务队列, 另外的一个死循环程序每次获取一个任务来修改数据
zcmxw1
2021-10-29 14:34:26 +08:00
我再提供一个方法:

update table
set a = a + 100
where id = 1
blackboom
2021-10-29 14:41:04 +08:00
并发竞争比较小的情况下可以考虑数据库乐观锁。

如果压力比较大,全部使用队列进行有序化。
Kimen
2021-10-29 14:44:56 +08:00
CAS
uiosun
2021-10-29 23:56:28 +08:00
@wunonglin 感谢大佬,如果用数据库手段的确可行,感觉配上 sleep 重试比较合适,但估计人多了会炸裂,明天试试队列能不能快速弥补一下。

@ihehe 谢谢大佬回复,其他锁是特定业务自己所必要的,和金币没关系。

以及预期是“特定时间段会偶现:10 个人同时修改一条金币数据”,金币又是玩家数据里比较重要的数值,乐观不起来。

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

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

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

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

© 2021 V2EX