最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java+mysql實現(xiàn)商品搶購功能

 更新時間:2018年02月08日 10:10:25   作者:Nifury  
這篇文章主要為大家詳細介紹了java+mysql實現(xiàn)商品搶購功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下

我們希望有人購買時檢查商品數(shù)量是否足夠,如果庫存有剩余那么就讓用戶購買成功,之后變更庫存,假如用戶排隊挨個購買這樣當然沒有問題。

可是實際情況下,可能是用戶多個用戶同時來購買,同時檢查庫存,這是可能庫存僅夠其中一人購買,但是由于庫存還沒減掉,就會出現(xiàn)幾個人都購買成功,然后庫存減為負數(shù)出現(xiàn)超賣的情況。這在大量用戶在同一時間點同時購買時極可能出現(xiàn)。
于是我們調整一下順序,有用戶購買時我們先減掉庫存,那你肯定要問,怎么減?庫存不夠一個人的時候也減?
我們假設每份商品有一個唯一的購買碼(開始搶購前預先生成),用戶搶到購買碼的數(shù)量即他買到的份數(shù),那么有用戶購買時我們第一步就是給幸運碼的狀態(tài)由有效更改為無效,并為其標記上其購買者ID

復制代碼 代碼如下:
"UPDATE `lottery_number` SET `status` = 失效狀態(tài),`user_id` = 購買者用戶Id,`current_time`= 時間戳  WHERE `goods_id` = 搶購的商品ID AND `status`=有效狀態(tài) LIMIT 購買份數(shù) ";

這樣其實mysql會給我們一個返回結果,叫做影響行數(shù),就是說這條語句更新影響了多少行的數(shù)據(jù),這個影響行數(shù)就是他實際購買到的商品份數(shù),如果影響行數(shù)為0,就說明一份也沒購買成功,也就意味著商品已經搶購完成了。

java實現(xiàn):

/**
 * 生成商品的購買碼<大量數(shù)據(jù)插入>
 *
 * @param goodsIssue
 * @author Nifury
 */
public void insertLotteryNumbers(GoodsIssue goodsIssue) {
 String prefix = "INSERT INTO `lottery_number` (`goods_id`, `periods`,`luck_number`, `create_time`, `status`, `issue_id` ) VALUES \n";
 Timestamp now = new Timestamp(System.currentTimeMillis());
 Connection con = null;
 try {
  con = jdbcTemplate.getDataSource().getConnection();
  con.setAutoCommit(false);
  PreparedStatement pst = con.prepareStatement("");
  Long total = goodsIssue.getTotalShare();// 總人次
  for (int i = 0; i < total; i += 10000) {// 1萬條提交一次
   StringBuffer suffix = new StringBuffer();
   List<Integer> numbers = new ArrayList<Integer>();
   for (int j = 0; j < 10000 && i+j < total; j++) {
    numbers.add(10000001 + i + j);
   }
   Collections.shuffle(numbers);//打亂幸運碼
   for (int n = 0,length = numbers.size(); n < length; n++) {
    suffix.append("(" + goodsIssue.getGoodsId() + ","
      + goodsIssue.getPeriods() + ","
      + numbers.get(n) + ",'" + now.toString() + "',"
      + 1 + "," + goodsIssue.getIssueId() + ")\n,");
   }
   // 構建完整sql
   String sql = prefix + suffix.substring(0, suffix.length() - 2);
   pst.addBatch(sql);
   pst.executeBatch();
   con.commit();
  }
  con.setAutoCommit(true);// 還原
  pst.close();
  con.close();
 } catch (Exception e) {
  e.printStackTrace();
  try {// 事務回滾
   con.rollback();
   con.setAutoCommit(true);
   con.close();
  } catch (SQLException e1) {
   e1.printStackTrace();
  }// 還原
 }
}

分配購買碼(我們的業(yè)務需要給購買用戶展示購買碼,所以有返回)

/**
 * 通過商品issue_id(每期每個商品有唯一issue_id)來隨機獲取購買碼(使用的購買碼會設為失效狀態(tài))
 * @param issueId
 * @param amount 需要獲取的購買碼的數(shù)量
 * @param userId
 * @return LotteryNumber對象列表
 * @author Nifury 2016-7-22
 */
public List<LotteryNumber> queryByNewIssueId2(Long issueId, Long amount,Long userId) {
 List<LotteryNumber> numberList = new ArrayList<LotteryNumber>();
 try {
  long currentTime=System.currentTimeMillis();
  String updateUserId = "UPDATE `lottery_number` SET `status` = 0,`user_id` = ?,`current_time`= ? WHERE `issue_id` = ? AND `status`=1 LIMIT ? ";
  int rownum=jdbcTemplate.update(updateUserId, userId, currentTime, issueId, amount );
  if(rownum>0){//還有剩余有效購買碼
   Object[] buyargs={issueId, userId ,currentTime};
   numberList = jdbcTemplate.query(QUERY + " WHERE `issue_id` = ? AND `status` = 0 AND `user_id` = ? AND `current_time`= ?",
     buyargs, LotteryNumberMapper);
  }
 } catch (DeadlockLoserDataAccessException e) {
  System.out.println("----分配購買碼出現(xiàn)死鎖,用戶分得0個購買碼-----");
 }
 return numberList;
}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Java設計模式之代理模式與@Async異步注解失效的解決

    Java設計模式之代理模式與@Async異步注解失效的解決

    代理模式是Java常見的設計模式之一。所謂代理模式是指客戶端并不直接調用實際的對象,而是通過調用代理,來間接的調用實際的對象
    2022-07-07
  • iOS socket網絡編程實例詳解

    iOS socket網絡編程實例詳解

    socket是一個針對TCP和UDP編程的接口,你可以借助它建立TCP連接等。這篇文章主要介紹了iOS socket網絡編程 ,需要的朋友可以參考下
    2017-03-03
  • SpringBoot獲取不到用戶真實IP的解決方法

    SpringBoot獲取不到用戶真實IP的解決方法

    最近遇到個問題,項目部署后發(fā)現(xiàn)服務端無法獲取到客戶端真實的IP地址,本文就來介紹一下這個問題的解決方法,感興趣的可以了解一下
    2023-08-08
  • Java數(shù)據(jù)結構學習之樹

    Java數(shù)據(jù)結構學習之樹

    這篇文章主要介紹了Java數(shù)據(jù)結構學習之樹,文中有非常詳細的代碼示例,對正在學習java數(shù)據(jù)結構的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-05-05
  • springboot2.0+elasticsearch5.5+rabbitmq搭建搜索服務的坑

    springboot2.0+elasticsearch5.5+rabbitmq搭建搜索服務的坑

    這篇文章主要介紹了springboot2.0+elasticsearch5.5+rabbitmq搭建搜索服務的坑,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-06-06
  • Java Spring數(shù)據(jù)單元配置過程解析

    Java Spring數(shù)據(jù)單元配置過程解析

    這篇文章主要介紹了Java Spring數(shù)據(jù)單元配置過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-12-12
  • Java Socket編程實例(三)- TCP服務端線程池

    Java Socket編程實例(三)- TCP服務端線程池

    這篇文章主要講解Java Socket編程中TCP服務端線程池的實例,希望能給大家做一個參考。
    2016-06-06
  • Spring IOC和DI實現(xiàn)原理及實例解析

    Spring IOC和DI實現(xiàn)原理及實例解析

    這篇文章主要介紹了Spring IOC和DI實現(xiàn)原理及實例解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-06-06
  • 關于JwtToken使用-重點看一下過期時間

    關于JwtToken使用-重點看一下過期時間

    這篇文章主要介紹了關于JwtToken使用-重點看一下過期時間,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • 一篇文章帶你學習Mybatis-Plus(新手入門)

    一篇文章帶你學習Mybatis-Plus(新手入門)

    這篇文章主要介紹了MyBatis-Plus 快速入門案例(小白教程),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-08-08

最新評論

仙居县| 衡阳市| 关岭| 长阳| 诸暨市| 绥化市| 阿荣旗| 璧山县| 连城县| 棋牌| 台山市| 新民市| 望江县| 天门市| 海南省| 宁国市| 北安市| 德格县| 册亨县| 江阴市| 普格县| 丰顺县| 信阳市| 乌鲁木齐县| 同江市| 青龙| 岗巴县| 嵊州市| 平武县| 沅陵县| 盱眙县| 视频| 合肥市| 三都| 永修县| 新乐市| 多伦县| 治多县| 鄂尔多斯市| 宁陵县| 志丹县|