国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - java+mysql實現商品搶購功能

java+mysql實現商品搶購功能

2021-04-02 13:35Nifury Java教程

這篇文章主要為大家詳細介紹了java+mysql實現商品搶購功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下

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

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

 

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


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

 

java實現:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
/**
 * 生成商品的購買碼<大量數據插入>
 *
 * @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();
  }// 還原
 }
}

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/**
 * 通過商品issue_id(每期每個商品有唯一issue_id)來隨機獲取購買碼(使用的購買碼會設為失效狀態)
 * @param issueId
 * @param amount 需要獲取的購買碼的數量
 * @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("----分配購買碼出現死鎖,用戶分得0個購買碼-----");
 }
 return numberList;
}

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

原文鏈接:http://blog.csdn.net/Nifury/article/details/52335084

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 国产精品永久 | 国产精品福利一区二区三区 | 日韩欧美中文字幕在线观看 | 国产一级特黄aaa大片 | 午夜精品久久久久久久久久久久 | 色网站在线 | 免费观看h片| 国产精品一二三在线观看 | 夜夜操导航 | 日韩激情一区 | 日本一区二区电影 | 午夜草逼| 欧美一级电影在线 | 日本久久久 | 精品日韩一区二区三区 | 欧美日韩视频一区二区 | 亚洲人人 | 日韩一区二区在线观看 | 一级免费视频 | 国产伦精品一区二区三区四区视频 | 毛片一级av| 久久久成人精品 | 日本在线中文 | 欧美一级特黄在线观看 | 亚洲欧美在线观看 | 日韩一区二区电影 | 日韩精品毛片免费看 | 精品久久一区 | 九色在线视频 | 久久综合久久综合久久 | 日韩资源在线 | 欧美黄色成人 | 99免费视频 | 中文字幕高清在线观看 | 国产精品第一国产精品 | 亚洲综合色自拍一区 | 搡女人真爽免费午夜网站 | 日韩成人精品在线 | 亚洲视频中文字幕 | 1000部精品久久久久久久久 | 久久久久国产一区二区三区四区 |