領取紅包時,如何防多線程時重復領取
阿新 • • 發佈:2018-07-24
類型 實體類 cor ++ 博客 oam tro println .com
今天公司做一個三周年活動領取紅包的接口,我先把我的想法表述一下(撇除業務邏輯)
- 往紅包表裏insert一條記錄,通過實體類中的用戶id(customerId)字段以及紅包類型(type)字段,來保證數據的唯一性
- 每次insert之前都會去紅包表裏面查詢是否已經有記錄了(根據customerId和type),如果有記錄就說明領取過了。
寫完之後測了幾下沒問題,push了代碼。
問題來了,當多個線程攜帶同個sessionToken訪問該url時,就會出現插入多條記錄的情況,測試代碼如下:
public class ThreadRunner implements Runnable { @Overridepublic 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,比較麻煩,各位看官如果有什麽好的方法歡迎留言!
謝謝觀看!
領取紅包時,如何防多線程時重復領取