1. 程式人生 > >領取紅包時,如何防多線程時重復領取

領取紅包時,如何防多線程時重復領取

類型 實體類 cor ++ 博客 oam tro println .com

今天公司做一個三周年活動領取紅包的接口,我先把我的想法表述一下(撇除業務邏輯)

  • 往紅包表裏insert一條記錄,通過實體類中的用戶id(customerId)字段以及紅包類型(type)字段,來保證數據的唯一性
  • 每次insert之前都會去紅包表裏面查詢是否已經有記錄了(根據customerId和type),如果有記錄就說明領取過了。

寫完之後測了幾下沒問題,push了代碼。

問題來了,當多個線程攜帶同個sessionToken訪問該url時,就會出現插入多條記錄的情況,測試代碼如下:

public class ThreadRunner implements Runnable {

    @Override
    
public void run() { //String url="http://localhost:8085/gamecenter/anniversary/getWelfare?sessionToken=S3BJVUNOVGI2VHRFYmhkdkFGaFlRWjRrZDNHTzE0NXg"; // String url="http://18.10.1.35:8085/gamecenter/anniversary/getWelfare?sessionToken=TlZqWEJjU1lMSmRkaEhESGNRR21KSW51WFJmdkRmc0o"; String url = "http://18.10.1.35:8085/gamecenter/anniversary/getWelfare?sessionToken=RHBBVktOam1IZDNHSjRvTnJURElvQ3d6SHJjQlFsTUc"; System.out.println(HttpClientUtil.sendGet(url)); }
public static void main(String[] args) { ExecutorService pool = Executors.newFixedThreadPool(10); for(int i = 0 ; i < 10 ; i++){ pool.submit(new ThreadRunner()); } pool.shutdown(); } }

解決方法:

新建一張customerId為主鍵的表——temp,每次往紅包表裏面insert之前都往temp表裏面insert一條,如果insert成功再去紅包表裏面insert記錄。

否則提示“領取失敗!技術分享圖片

用同樣的方法再測一下。結果如下,當多個線程時,就只會領取一次了。

技術分享圖片

總結:第一次寫博客,語言比較笨拙,對於這種問題的解決方法也比較low,比較麻煩,各位看官如果有什麽好的方法歡迎留言!

謝謝觀看!

領取紅包時,如何防多線程時重復領取