누군가가 구매할 때 제품의 수량이 충분한 지 확인하기를 바랍니다. 인벤토리에 잉여가있는 경우 사용자가 성공적으로 구매 한 다음 인벤토리를 변경할 수 있습니다. 사용자가 하나씩 구매하기 위해 대기하는 경우 물론 문제가 없습니다.
그러나 실제로 여러 사용자가 동시에 구매하고 동시에 인벤토리를 확인할 수 있습니다. 이는 인벤토리가 구매하기에 충분하지만 재고가 줄어들지 않았으므로 여러 사람이 성공적으로 구매하면 재고가 부정적인 상태로 줄어 듭니다. 많은 사용자가 동시에 동시에 구매할 때 발생할 가능성이 높습니다.
그래서 우리는 순서를 조정합니다. 일부 사용자가 구매하면 먼저 인벤토리를 줄입니다. 그런 다음 어떻게 줄이는 지 물어봐야합니까? 인벤토리가 한 사람에게 충분하지 않을 때도 줄어 듭니까?
각 제품에는 고유 한 구매 코드 (구매를 시작하기 전에 사전 제작)가 있으며 사용자가 잡는 구매 코드 수는 그가 구매 한 사본 수입니다. 그런 다음 사용자가 구매하면 첫 번째 단계는 Lucky Code의 상태를 유효한 것에서 유효하지 않은 것으로 변경하여 구매자 ID로 표시하는 것입니다.
코드 사본은 다음과 같습니다. "update`lottery_number` set`status '= invalid status,`user_id` = 구매자 사용자 id,`current_time` = timestamp`goods_id` = snatched product id 및`status` = 유효한 상태 제한 구매 사본";
이런 식으로 MySQL은 행 수에 영향을 미치는 반환 결과를 제공합니다.이 명령문은 영향을 미치는 행 수에 대한 데이터를 업데이트합니다. 이것은 행의 수에 영향을 미치는 것은 실제로 구매 한 제품의 사본 수입니다. 행의 수가 0 인 경우 사본이 성공적으로 구입되지 않았 음을 의미합니다. 즉, 제품이 구매하도록 서두르 었음을 의미합니다.
Java 구현 :
/** * 제품의 구매 코드를 생성 <많은 양의 데이터 삽입> * * @param goodsissue * @author nifury */public void insertlotterynumbers (goodsissue goodsissue) {string prefix = "삽입````goods_id`,`goods_number`,`luck_number` 값 /n "; timestamp now = new Timestamp (System.CurrentTimeMillis ()); 연결 con = null; {con = jdbctemplate.getDatasource (). getConnection (); con.setAutocommit (false); preparedstatement pst = con.preparestatement ( ""); long total = goodsissue.getTotalShare (); // 총 방문자 수 (int i = 0; i <total; i += 10000) {// 10,000 Submissions 일단 StringBuffer 접미사 = new StringBuffer (); 목록 <integer> 번호 = new ArrayList <integer> (); for (int j = 0; } collections.shuffle (numbers); // 스크램블 럭키 코드 (int n = 0, length = numbers.size (); n <length; n ++) { "(" + goodsissue.getgoodsid () + "," + goodsissue.getperiods () + "," + numbers.get (n) + ", '" + " +", " goodsissue.getissueid () + ")/n,"); } // 완전한 SQL 문자열 빌드 SQL = Prefix + wiffix.substring (0, puffix.length () -2); pst.addbatch (SQL); pst.executebatch (); con.commit (); } con.setAutocommit (true); // pst.close (); con.close (); } catch (예외 e) {e.printstacktrace (); {// 트랜잭션 롤백 con.rollback (); con.setAutocommit (true); con.close (); } catch (sqlexception e1) {e1.printstacktrace (); }// 복원하다 }}구매 코드를 지정합니다 (구매 코드를 구매자에게 표시해야하므로 반품이 있습니다).
/** * 제품 ressue_id를 통해 구매 코드를 무작위로 가져옵니다 (각 제품은 문제 당 고유 한 문제가 있습니다. 금액, 긴 userID) {list <TOTTERYNUMBER> 번호 목록 = new ArrayList <TOTTERYNUMBER> (); try {long currenttime = system.currenttimeMillis (); String updateUserId = "update`lottery_number` set`status` = 0,`user_id` =?,`current_time` =? where`ressue_id` 및`status` = 1 한계?"; int rownum = jdbctemplate.update (updateUserId, userId, currenttime, issuesid, mold); if (rownum> 0) {// 여전히 유효한 구매 코드가 왼쪽과 오른쪽에 있습니까? Object [] buyArgs = {ressueId, userId, currenttime}; 숫자 목록 = jdbctemplate.query (query + "where` ressue_id` =? 및`status` = 0 및`user_id` =? 및`current_time` =?", buyargs, lotterynumberMapper); }} catch (DeadlockloserDataAccessException e) { System.out.println("------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.