線上出現了一個問題:mq同步某一功能的資料的時候,同一主鍵的資料會發多次。業務邏輯是,某一條資料過來後,我會先去資料庫查是否存在了此uuid的資料,如果有的話更新,如果沒有的話插入。由於同一主鍵的資料會發不止一次的mq,並且間隔時間非常小,所以就導致了,兩條資料都進入了插入的邏輯裡面。丟擲主鍵衝突的異常。另外就算是進入到了不同的更新和插入的邏輯裡面,有時會出現第二條資料先進來,然後第一條資料再進來,此時資料庫裡面更新的就是第一次的資料,就會產生了資料錯誤。
綜合上述的描述,目前要解決的事情有:1、mq併發。2、資料儲存順序(前提:有標識能區分mq最新資料)。
基於上述描述準備用merge into 語句,用資料庫層面的事物來保證資料的一致性。那麼現在就來贅述一下merge into的一些用法
merge into 是用來進行合併表的,但因為其特性不同場合用法有以下幾種
1、合併表
2、外部資料插入更新
3、用join表更新
1和3我這裡就不贅述了,我使用到的是2這一類,最後經過改造我所用到的sql如下:
1 MERGE INTO mytable t1
2 USING dual ON ( t1.tuuid =?)
3 WHEN MATCHED THEN
4 UPDATE SET modify_date =?,
5 flg =?
6 WHERE flg != `N`
7 WHEN NOT MATCHED THEN
8 INSERT (
9 uuid,
10 flg,
11 modify_date ) VALUES (?,?,?);
由於是外部更新,屬於型別2只有一張表,所以在第2行引入偽表做關聯條件。同時sql第6行判斷的是mq的順序,如果根據uuid發現表裡面存在資料並且flg值為‘N’就表示mq過來後插入的是第二條資料,那麼就不需要再做更新。(關鍵的地方是第2行【偽表】和第6行【merge語句可以在update語句裡面寫where條件】的改動)