想基于golang设计一个微服务系统,数据存储使用mongodb,而由于mongodb没有MVCC功能,不知道该如何控制数据版本.场景如下:
两个客户端A和B同时登录了用户U,登录后他们拿到了用户的数据,然后分别对用户数据进行了更改,表示为Ua和Ub,然后A和B向服务端提交修改后的Ua和Ub,而Ub先被服务端接收并处理,那么Ua应该怎么处理.
我知道的两种方案:
1.在A和B想要修改用户数据前就使用分布式锁去竞争修改权,获得修改权的用户才能修改和提交数据.
2.使用乐观锁,处理数据版本问题,后一个被处理的数据由于版本落后而失败.
第一个方案是不是用户体验不太好,平时没注意有使用这种做法的产品.第二个方案会导致后一个修改数据被丢弃,体验也不要,而且由于mongodb没有MVCC的支持,实现起来要给所有可能冲突的数据加上版本控制,增加了逻辑复杂性.
那此类问题的通常解决方案是什么?大家都是怎么解决的呢?