最近做項目,遇到一個邏輯,就是在修改單條記錄時需要返回該記錄的id。
先說一下我的使用環境,springMVC+MyBatis,於是上度娘查了一下,將結果記錄一下,僅供日後參考和大家們共同探討
具體邏輯就是在多個條件下,包括一個嵌套查詢,對一條記錄進行更新,並返回該記錄的主鍵id,在這個查詢語句裏面用到一個變量update_id在執行更新語句的時候將本記錄的id重新賦值爲自身的id,同時將自身的id賦值給updatge_id這個變量,最後返回這個變量,就是這個更新最後的目的。
SET @update_id := 0;
UPDATE activity_prize_voucher apv
SET apv.mobile = 18888888888,
apv.state = 1,
apv.exchange_time = NOW(),
apv.id =(SELECT @update_id := id)
WHERE
apv.prize_id = 2
AND apv.state = 0
AND mobile IS NULL
AND exchange_time IS NULL
<span style="color:#ff0000;">AND(
SELECT
vv.exchangeCount <= 2000
FROM
(
SELECT
COUNT(*)AS exchangeCount
FROM
activity_prize_voucher apvv
WHERE
apvv.prize_id = 2
AND apvv.state = 1
AND DATE_FORMAT(NOW(), '%Y%m%d')= DATE_FORMAT( apvv.exchange_time, '%Y%m%d' )
)AS vv
)</span>
LIMIT 1;
SELECT
@update_id;
<select id="exchangeVoucher" parameterType="hashmap" resultType="java.lang.Integer">
SQL
</select>
int exchangeVoucher(Map<String, Object> queryParams);
就這麼簡單,這個功能就初步完成,下面對這個邏輯進行優化調整
=================分割線=========================
好,在華麗麗的分割線下面咱們在討論一下上面那段sql裏面紅顏色的,在MySQL裏面如果要在upadte和delete裏面用嵌套查詢一般是不行的,但是如果你將這個嵌套查詢AS爲一個對象,然後在對這個對象進行查詢應該就可以了。
但是,在這裏MySQL鎖定WHERE條件掃描過的所有索引記錄,在高併發的時候就會導致紅色語句出現死鎖現象,那麼問題來了,如何控制紅色字體的條件,由於紅色區域內的語句只是用來統計一定條件下的數量的,所以只能通過代碼邏輯進行獨立控制。
最後將紅色字體代碼捨去,在執行更新語句之前進行邏輯判斷來控制。
如果哪位達人有更好的方法,希望給我反饋,謝謝。我這裏只是拋磚引玉。