樂觀鎖:解決多節(jié)點(diǎn)部署定時(shí)任務(wù),數(shù)據(jù)重復(fù)插入問題

場(chǎng)景

1、定時(shí)任務(wù)掃描A表,根據(jù)A表中a1字段的值是否為0,來標(biāo)識(shí)是否已經(jīng)給B表插入了數(shù)據(jù);
2、若掃描到A表中rowA記錄a1字段值為0,則將rowA記錄a1字段值置為1。并根據(jù)rowA記錄生成待插入B表的數(shù)據(jù)rowB,將rowB插入B表;

存在問題

多節(jié)點(diǎn)部署服務(wù)后,同時(shí)存在多個(gè)節(jié)點(diǎn)上的定時(shí)任務(wù)同時(shí)操作同一個(gè)庫(kù)中的同一張表。這樣可能會(huì)存在給B表插入了多條相同的數(shù)據(jù)。具體情況如下圖:


Screen Shot 2020-05-08 at 9.21.01 AM.png

解決方案:

因?yàn)檫@種場(chǎng)景中,多個(gè)節(jié)點(diǎn)共用了一個(gè)數(shù)據(jù)庫(kù)。所有我們可以從數(shù)據(jù)庫(kù)方面考慮,解決該問題。這里有2種方案。

  1. 給B表中某個(gè)唯一字段(比如b字段)添加唯一索引。
  2. 使用樂觀鎖給限制A表的更新,若更新成功,則給B表插入數(shù)據(jù)。
select flag, version from user where id = xxx
update user set flag = 1, version = {newVersion} where id = {id} and version = {oldVersion}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容