排序字段出现重复 + 分页读出 引起的问题
需求
将提交生成的待发放奖励记录发放出去,因为一个用户可能有多条奖励,而发放奖励时候需要对用户加悲观锁,所以本人先按用户ID对记录继续排序,然后再对单个用户批量发出奖励;但因奖励记录超过十万条,故对其分页读出。整体逻辑:
按用户ID排序分页读出1000条记录 -> 对单个用户批量发放奖励
遇到的问题
用户发放记录和奖励记录条数是一样的,但是为什么用户会发重复的奖励?比如:用户1有奖励1、奖励2、奖励3等多条奖励,但是他拿了2次奖励1,但是没有拿奖励3,其余奖励又是正常拿到。
原因
排序字段“用户ID”存在重复,则排序时候对于同一个用户的奖励记录的局部排序可能会变化;此时如果同一个用户的记录分散在不同页里面,那么可能存在拿上一页时这个用户的局部奖励排序和拿下一页时这个用户的局部奖励排序不一致的问题。
导致用户在上一页拿出的奖励记录在下一页也被拿出来了,而本应在下一页被拿出的奖励记录却没有被拿出,故出现重复发放和未发放的问题。
处理
在对用户ID进行排序的同时,增加主键ID的排序(或者增加其他能保证唯一性的字段排序)。

浙公网安备 33010602011771号