假设如下场景:
玩家A与B拥有同一份背包,背包中包括玩家道具,是否已经种花等信息,如果没有种花,则两个玩家都可以进行种花,但是一旦其中一个玩家种花了,另一个就不能种了。种花的时候会扣除相应的道具。
背包文档如下:
{
itemList:[
{id:20,num:12},
{id:1,num:10},
{id:2,num:12},
{id:12,num:12}],
flowerId:0
}
- flowerId如果为0表示玩家A与B都可以种花
- 种花的操作可以简单表示为将flowerId置1
- 种花操作需要扣除id为1的道具2个,id为2的道具3个
- A与B随时都可以进行其它操作导致道具数量变化
- 如果道具数量不足则不能种花。
因为在分布式系统中A与B可以同时进行种花的操作,如果处理不好会导致道具被扣除两次或者道具不够依然种花成功,那要怎么保证数据的一致性呢?
解决办法,目前只想到这2个:
- 对背包文档进行加锁,这种操作感觉不太优雅,有可能存在死锁的情况。
- 由于mongodb对同一个文档的操作是原子性的,所以可以考虑用一条update命令来实现判断是否种花,判断道具数量足够,flowerId置1,减少相关道具数量,但还没有找到一条命令就能实现这些操作的命令。