記錄一次遞迴查詢的運用
背景:多個人隨機拉取一條公共池裡面乾淨的資料,保證可以將池子裡所有資料處理完,並且已經處理完的資料不可被覆蓋
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,表設計
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4686/viewspace-2822289/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- sqlalchemy 遞迴查詢SQL遞迴
- PostgreSQL 遞迴查詢SQL遞迴
- SqlServer遞迴查詢SQLServer遞迴
- 遞迴查詢子元素遞迴
- 透過遞迴查詢應用依賴遞迴
- java-遞迴(檔案查詢)Java遞迴
- 遞迴樹形查詢所有分類遞迴
- 遞迴-M--二分查詢遞迴
- 遞迴的列印和階乘運用遞迴
- 第二章 :查詢與排序-------二分查詢的遞迴解法排序遞迴
- Java實現遞迴查詢樹結構Java遞迴
- iOS 演算法之排序、查詢、遞迴iOS演算法排序遞迴
- 資料庫遞迴查詢:MySQL VS Sequelize資料庫遞迴MySql
- ORACLE遞迴查詢(適用於ID,PARENTID結構資料表)Oracle遞迴
- 第二章 :查詢與排序---------遞迴、查詢與排序補充排序遞迴
- 簡單C#遞迴(向前查詢上工序)C#遞迴
- 記一次通過 Resource 遞迴生成樹的方案遞迴
- 記錄一下使用左關聯的一次查詢(可樂的筆記)筆記
- SQL server資料庫with as子句與遞迴查詢的實現SQLServer資料庫遞迴
- 二分法查詢(遞迴實現)遞迴
- mysql 隨機查詢記錄MySql隨機
- 二分查詢的兩種實現形式遞迴和迭代遞迴
- oracle之樹狀結構的儲存與展示(遞迴查詢)Oracle遞迴
- 【記錄】sqlserver列轉行查詢 並將查詢結果用逗號分隔開SQLServer
- Python遞迴函式,二分查詢演算法Python遞迴函式演算法
- 同事問我MySQL怎麼遞迴查詢,我懵逼了MySql遞迴
- 記一次遞迴在我專案中所發揮的作用遞迴
- 遞迴小記遞迴
- 【記錄】SSH分頁查詢功能
- 記錄一次在keil中,查詢ALIGN()括號裡任意字元,ALIGN(.*)字元
- 記一次詭異的Oracle查詢轉換Oracle
- Hellow C# unity學習記錄(8)函式的遞迴C#Unity函式遞迴
- 壓測平臺 - 記錄一次百億級資料查詢最佳化
- mysql 查詢記錄數大於一千萬的表MySql
- 查詢SQL Server的歷史執行記錄SQLServer
- 查詢當天的系統訂單記錄
- cmdb 查詢資料庫操作記錄資料庫
- JS遞迴過濾樹形結構陣列物件--模糊查詢JS遞迴陣列物件