併發插入insert,根據狀態判斷重覆記錄的問題

2021-05-22 04:59:08 字數 440 閱讀 6773

在判斷記錄是否重複,通常在插入這條記錄時會用select語句查詢時下是否有相同記錄,如果存在,就不允許插入。

這種select和insert之間有時間間隔,如果併發的有兩個人同時在insert,在select時,都沒發現有相同的記錄,結果資料庫裡就被插入了兩條相同的記錄。

這種方式不能嚴格的控制記錄的唯一性

由於組合字段有些情況下可以重複,所以又不能在組合欄位上建立唯一約束。

解決上述問題有下面幾中方法

1.  用某些情況可以重複的組合欄位+乙個標誌字段建立唯一約束,不能重複的情況,標誌位都相同,如都為1。如果可以重複的,將標誌位設定成隨機數,如uuid,36進製數字

2.把乙個欄位裡不同值的記錄放在不同的表裡,這樣就可以在表上建立唯一約束了。比如,把字段值等於1的放乙個表,字段值等於2的放另乙個表

3.使用統一的鎖,在插入之前鎖定,讓後判斷是否重複,再插入

MySQL不插入重覆記錄

想插入一條記錄,如果有則不插入,無則插入。表示由乙個自增長id主鍵和其他幾個記錄 t version id,package name,first,second,third,forth 原先想用insert ignore into,但是發現沒有用,因為它把id也看做不同。於是我找了網上的另外一種方法 ...

DataTable插入資料,刪除重覆記錄

之前有篇文章簡單講了下批量插入資料的方法,但是沒有考慮到有重複值的情況,sqlbulkcopy也沒有提供相關方法。自己寫了乙個方法,傳入兩個table 目標table和源table 刪除重複行 目標table 源table public int deletereptrows datatable ta...

SQL插入 去除重覆記錄的實現

最近的在做乙個cs的專案後端使用了oracle資料庫,功能實現的過程中要求對sql語句進行很好的處理,這就涉及到了今天的主題sql插入時去除重覆記錄的實現,這裡有兩種方式提供給大家分別是 merge into,not exists。下面將通過兩種方式來實現 將 表a 與 表b 不重複的user資訊 ...