Esperamos que, quando alguém comprar, verifique se a quantidade do produto é suficiente. Se houver um excedente no inventário, o usuário poderá comprá -lo com sucesso e alterar o inventário. Se o usuário fizer filas para comprar uma a uma, é claro que não há problema.
Mas, na realidade, pode ser que vários usuários venham compra ao mesmo tempo e verifiquem o inventário ao mesmo tempo. Pode ser que o inventário seja suficiente para um deles comprar, mas como o inventário não foi reduzido, várias pessoas o compram com sucesso e, em seguida, o inventário será reduzido a negativo e sobre vendido. É muito provável que ocorra quando um grande número de usuários compra ao mesmo tempo ao mesmo tempo.
Então, ajustamos o pedido. Quando alguns usuários compram, primeiro reduzimos o inventário. Então você deve perguntar, como reduzi -lo? Isso também reduzirá quando o inventário não for suficiente para uma pessoa?
Assumimos que cada produto possui um código de compra exclusivo (pré-fabricado antes de iniciar a compra) e o número de códigos de compra que o usuário agarra é o número de cópias que ele comprou. Então, quando um usuário compra, nosso primeiro passo é alterar o status do código da sorte de válido para inválido e marcá -lo com seu ID do comprador.
A cópia do código é a seguinte: "UPDATE` lottery_number` set `status` = status inválido,` user_id` = ID do usuário do comprador, `current_time` = timestamp onde` bens_id` = snatched Product ID e `status` = status válido limite de cópias adquiridas";
Dessa forma, o MySQL nos fornecerá um resultado de retorno, chamado afetando o número de linhas, o que significa que essa instrução atualiza os dados de quantas linhas afeta. Isso afeta o número de linhas é o número de cópias do produto que ele realmente comprou. Se o número de linhas for 0, significa que nenhuma cópia foi comprada com sucesso, o que significa que o produto foi apressado para comprar.
Implementação de Java:
/** * Generate the purchase code of the product <Insert a large amount of data> * * @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` ) Valores /n "; Timestamp agora = novo timestamp (System.CurrentTimEmillis ()); Conexão con = null; tente {con = jdbctemplate.getDataSource (). getConnection (); Con.SetAutocomit (false); Preparado Pstatement Pst = Con.Preparestatement (""); Total longo = bensissuse.gettotalshare (); // Número total de visitantes para (int i = 0; i <total; i += 10000) {// 10.000 envios quando o sufixo StringBuffer = new StringBuffer (); Lista <Teger> números = new ArrayList <Teger> (); for (int j = 0; j <10000 && i+j <total; j ++) {número.add (10000001+i+j); } Coleções.Shuffle (números); // Scramble Código da sorte para (int n = 0, comprimento = número.size (); n <comprimento; n ++) {suffix.append ("(" + bensissue.getgoodsid () + "," + bensissue.getPeriod () + "," + números.get (n) "", "," " +" +. bensissue.getissueId () + ")/n,"); } // Crie a string sql completa sql = prefixo + sufixo.substring (0, sufix.length () - 2); pst.addbatch (SQL); pst.executeBatch (); con.Commit (); } Con.SetAutocomit (true); // restaurar Pst.Close (); con.close (); } catch (Exceção e) {e.printStackTrace (); tente {// Rollback de transação Con.Rollback (); Con.SetAutocomit (true); con.close (); } catch (sqLexception e1) {e1.printStackTrace (); } // restauração}}Atribua um código de compra (nossa empresa precisa mostrar o código de compra ao comprador, para que haja um retorno)
/** * Obtenha o código de compra aleatoriamente por meio do produto Issue_Id (cada produto possui um problema exclusivo_id por edição) (o código de compra usado será definido como estado inválido) * @param edblesId * @param valor o número de códigos de compra a ser obtido * @param userId * @return loterynumber list * @author nifury 2016-7-22 * 22 * quantidade, long userID) {list <ToTerynumber> numberList = new ArrayList <ToTerynumber> (); tente {long curntime = System.currenttimemillis (); String updateUserID = "UPDATE` lottery_number` set `status` = 0,` user_id` =?, `Current_time` =? Onde` editora_id` =? E `status` = 1 limite?"; int rownum = jdbctemplate.update (updateUserID, userID, CurrentTime, IssueId, valor); if (ROWNUM> 0) {// ainda existem códigos de compra válidos à esquerda e à direita? Objeto [] Buyargs = {Issueid, UserID, CurrentTime}; numberList = jdbcTemplate.Query (Query + "Where` Issue_id` =? e `status` = 0 e` user_id` =? e `current_time` =?", BuyArgs, LotterynumberMapper); }} catch (deadlockloserDataAccescessception e) { System.out.println("------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.