激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

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

服務(wù)器之家 - 編程語言 - Java教程 - java+mysql實(shí)現(xiàn)商品搶購功能

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

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

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

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

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

 

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


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

 

java實(shí)現(xiàn):

?
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
/**
 * 生成商品的購買碼<大量數(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();// 總?cè)舜?/code>
  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);//打亂幸運(yùn)碼
   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,");
   }
   // 構(gòu)建完整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 {// 事務(wù)回滾
   con.rollback();
   con.setAutoCommit(true);
   con.close();
  } catch (SQLException e1) {
   e1.printStackTrace();
  }// 還原
 }
}

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

?
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)來隨機(jī)獲取購買碼(使用的購買碼會設(shè)為失效狀態(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;
}

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 二级大黄大片高清在线视频 | 在线观看免费av网 | 国产妇女乱码一区二区三区 | 毛片大全在线观看 | 在线成人av观看 | 久久精品视频免费 | 日本黄色不卡视频 | 99精品视频在线观看免费播放 | 精品国产视频一区二区三区 | 色诱亚洲精品久久久久久 | 91看片在线播放 | 伊人99在线 | 草莓福利社区在线 | 国产999精品久久久久 | 中文字幕www. | 亚洲国产精品一区二区久久 | 久久福利精品 | 香蕉黄色网 | 日韩精品久久久久久久电影99爱 | 黄色成年在线观看 | 精品日韩欧美 | 视频一区二区三区中文字幕 | 国产一级一国产一级毛片 | 亚洲第一成av人网站懂色 | 毛片一区二区三区 | 欧美国产一区二区三区激情无套 | 免费在线观看国产精品 | 成人久久久精品乱码一区二区三区 | 日本免费大片免费视频 | 欧美一级在线看 | 国产成人在线综合 | 国产91精品一区二区麻豆亚洲 | 亚州综合一区 | 成人免费av在线 | av电影在线免费 | 亚洲成人第一页 | 国产免费片 | 韩国精品视频在线观看 | 日韩黄站 | 国产精品成人久久 | 91社区在线观看 |