如何原子性的重排某个队列?

某需求,当前存在一个有序队列,要求可以原子性的增加、删除、重排列表中的元素。并且队列的内容是通过Web来管理和交互的。 
有没有什么很好的解决方案?目前存储和算法都没定,只是打算用Python实现。 
用锁和优先级的话,由于多用户访问时,可能出现以下情况导致原子性丧失: 
1、A用户打开页面 
2、B用户打开页面 
3、A用户添加了一个元素,并提交(此时这个修改并没有反馈到B用户那里去) 
4、B用户重排了列表。此时会有冲突,用优先级来实现的话,必然可能出现重排后的原始列表中的某项和后添加的那个元素优先级冲突,造成逻辑丧失。 
不知道除了优先级和锁的方法,还有什么比较好的实现?


可以采用svn版本控制的思想,每一条记录,增加version字段,提交时,通过目前数据表中记录的version和要提交到数据表的数据的version进行判断,视具体业务需求,是 merge(合并)还是revert(覆盖)


冲突是无法避免的,最重要的问题是检测冲突,然后由用户决定如何应对冲突。


具体来说基本上跟 @高原 的做法差不多,不过不一定需要增加version字段侵入原来数据的设计。可以在http请求上增加 request ticket,这个ticket是可以用来追踪单一用户的一系列动作的;并且resource manager自身维护一个资源状态图DAG,为每一个资源访问者分别维护状态。


当一个用户申请了一个ticket的时候,manager 就在状态图中添加一个分支,类似于Git。当任何一个访问者执行了非幂等性的操作时(例如,重排、添加删除)就从DAG中查找最近的一个分支点,并且使得从这个分支点出发的所有其他ticket失效。当持有其他分支ticket的访问者试图执行另一个非幂等性操作时,就会发现冲突。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值