場(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種方案。
- 給B表中某個(gè)唯一字段(比如b字段)添加唯一索引。
- 使用樂觀鎖給限制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}