記錄一次遞迴查詢的運用
背景:多個人隨機拉取一條公共池裡面乾淨的資料,保證可以將池子裡所有資料處理完,並且已經處理完的資料不可被覆蓋
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- grep遞迴查詢子目錄遞迴
- 用VisualC++6.0遞迴查詢目錄樹 (轉)C++遞迴
- PostgreSQL 遞迴查詢SQL遞迴
- PostgreSQL=>遞迴查詢SQL遞迴
- SqlServer遞迴查詢SQLServer遞迴
- ORACLE 遞迴查詢Oracle遞迴
- Oracle SQL的遞迴查詢OracleSQL遞迴
- SQL Server遞迴查詢SQLServer遞迴
- Oracle遞迴查詢sqlOracle遞迴SQL
- 一個遞迴查詢遞迴
- 透過遞迴查詢應用依賴遞迴
- MS SQL Server的遞迴查詢SQLServer遞迴
- sql無限遞迴查詢SQL遞迴
- sql遞迴查詢子級SQL遞迴
- 關於樹型結構資料遞迴查詢,轉非遞迴查詢的實現遞迴
- 我對Postgresql遞迴查詢的理解SQL遞迴
- MS SQL Server的遞迴查詢(2)SQLServer遞迴
- oracle中的遞迴sql查詢 connect by prior實現遞迴Oracle遞迴SQL
- java-遞迴(檔案查詢)Java遞迴
- SQL with as 的用法 以及遞迴函式的寫法 遞迴層次查詢SQL遞迴函式
- 遞迴-M--二分查詢遞迴
- 遞迴樹形查詢所有分類遞迴
- 11GR2遞迴With子查詢遞迴
- Mysql 實現樹狀遞迴查詢MySql遞迴
- 第二章 :查詢與排序-------二分查詢的遞迴解法排序遞迴
- iOS 演算法之排序、查詢、遞迴iOS演算法排序遞迴
- 資料庫遞迴查詢:MySQL VS Sequelize資料庫遞迴MySql
- Java實現遞迴查詢樹結構Java遞迴
- Sql Server 使用CTE實現遞迴查詢SQLServer遞迴
- 【演算法拾遺】二分查詢遞迴非遞迴實現演算法遞迴
- 第二章 :查詢與排序---------遞迴、查詢與排序補充排序遞迴
- [Mysql 查詢語句]——查詢指定記錄MySql
- Ztree + PHP 無限級節點遞迴查詢PHP遞迴
- oracle中connect by prior實現遞迴查詢Oracle遞迴
- 記錄一下使用左關聯的一次查詢(可樂的筆記)筆記
- ORACLE遞迴查詢(適用於ID,PARENTID結構資料表)Oracle遞迴
- 查詢鎖表記錄
- SQL2005/2008中的CTE應用--遞迴查詢SQL遞迴