背景:多个人随机拉取一条公共池里面干净的数据,保证可以将池子里所有数据处理完,并且已经处理完的数据不可被覆盖
1,Service
@Override
@Transactional(rollbackFor = Exception.class)
public MarkTextPO pullMarkText(Long userId) {
MarkTextPO markTextPO;
//先将属于自己但未完成的数据取出
markTextPO = markTextPOMapper.selectUnFinishedByUserId(userId);
//从公海中取,并打上标记
if (markTextPO == null) {
markTextPO = getFromPublic(userId);
}
return markTextPO;
}
private MarkTextPO getFromPublic(Long userId) {
int max = 10000;
MarkTextPO markTextPO = getRandomPO(max);
if (Objects.isNull(markTextPO)) {
return null;
}
Long flag = markTextPOMapper.updateByOwnerUserId(markTextPO.getMarkTextId(), userId);
if (flag < 1) {
return getFromPublic(userId);
}
return markTextPO;
}
private MarkTextPO getRandomPO(int max) {
if (max < 1) {
return null;
}
int next = random.nextInt(max);
MarkTextPO markTextPO = markTextPOMapper.selectUnFinished(next);
if (Objects.isNull(markTextPO)) {
return getRandomPO((next + 1) / 2);
}
return markTextPO;
}
2,mapper
<select id="selectUnFinishedByUserId" resultMap="BaseResultMap">
select
<include refid="Base_Column_List"/>
from mark_text
<where>
finish_status = 2
and own_user_id = #{userId}
and enabled_status = 1
</where>
limit 1
</select>
<select id="selectUnFinished" resultMap="BaseResultMap">
select
<include refid="Base_Column_List"/>
from mark_text
<where>
finish_status = 2
and own_user_id = 0
and enabled_status = 1
</where>
limit #{next},1
</select>
<update id="updateByOwnerUserId">
update mark_text
set own_user_id = #{userId}
where mark_text_id = #{markTextId}
and own_user_id = 0
</update>
3,表设计
點(diǎn)擊查看更多內(nèi)容
1人點(diǎn)贊
評(píng)論
評(píng)論
共同學(xué)習(xí),寫(xiě)下你的評(píng)論
評(píng)論加載中...
作者其他優(yōu)質(zhì)文章
正在加載中
感謝您的支持,我會(huì)繼續(xù)努力的~
掃碼打賞,你說(shuō)多少就多少
贊賞金額會(huì)直接到老師賬戶(hù)
支付方式
打開(kāi)微信掃一掃,即可進(jìn)行掃碼打賞哦
今天注冊(cè)有機(jī)會(huì)得
100積分直接送
付費(fèi)專(zhuān)欄免費(fèi)學(xué)
大額優(yōu)惠券免費(fèi)領(lǐng)