Esperamos que cuando alguien compre, verifique si la cantidad del producto es suficiente. Si hay un excedente en el inventario, el usuario podrá comprarlo con éxito y luego cambiar el inventario. Si el usuario hace cola para comprar uno por uno, por supuesto, no hay problema.
Pero en realidad, puede ser que varios usuarios vengan a comprar al mismo tiempo y verifiquen el inventario al mismo tiempo. Esto puede ser que el inventario es suficiente para que uno de ellos compre, pero dado que el inventario no se ha reducido, varias personas lo comprarán con éxito, y luego el inventario se reducirá a negativo y sobrevendido. Es muy probable que esto ocurra cuando una gran cantidad de usuarios compran al mismo tiempo al mismo tiempo.
Entonces ajustamos el orden. Cuando algunos usuarios compran, primero reducimos el inventario. Entonces debes preguntar, ¿cómo reducirlo? ¿También se reducirá cuando el inventario no sea suficiente para una persona?
Suponemos que cada producto tiene un código de compra único (prefabricado antes de comenzar la compra), y la cantidad de códigos de compra que el usuario toma es la cantidad de copias que compró. Luego, cuando un usuario compra, nuestro primer paso es cambiar el estado del código de suerte de válido a inválido, y marcarlo con su ID de comprador.
La copia del código es la siguiente: "Actualizar` lottery_number` set `status` = estado inválido,` user_id` = comprador ID de usuario, `current_time` = timestamp donde` gots_id` = ID de producto arrebatado y `status` = válido límite de estado comprado copias";
De esta manera, MySQL nos dará un resultado de retorno, llamado que afecta el número de filas, lo que significa que esta declaración actualiza los datos de cuántas filas afecta. Esto afecta la cantidad de filas es el número de copias del producto que realmente compró. Si el número de filas es 0, significa que no se compró con éxito la copia, lo que significa que el producto ha sido apresurado a comprar.
Implementación de Java:
/** * Genere el código de compra del producto <Inserte una gran cantidad de datos> * * @param GoodsiseSeS * @author Nifury * /public void InsertLotterynumbers (GoodsSeSe GoodsSiseSeSe) {String prefix = "Insertar en` lottery_number` (`books_id`,` períodos ', `suerte_number`,` create_time`, `status',` temas /valores '). TimeStamp Now = nueva marca de tiempo (System.CurrentTimemillis ()); Conexión con = nulo; intente {con = jdbctemplate.getDataSource (). getConnection (); con.setAutOcommit (falso); Preparado PST = Con.PrepareStatement (""); Long Total = GoodsSiseS.GetToTalShare (); // Número total de visitantes para (int i = 0; i <total; i += 10000) {// 10,000 presentaciones una vez StringBuffer sufix = new StringBuffer (); List <Integer> números = new ArrayList <Integer> (); for (int j = 0; j <10000 && i+j <total; j ++) {números.add (10000001+i+j); } Colección.shuffle (números); // Scramble Lucky Code for (int n = 0, longitud = números.size (); n <longitud; n ++) {sufix.append ("(" + mets methoseSeSeS.getGoodSid () + "," + metsossiseSeSeSePeriods () + "," + números.get (n) + " +" + ahora ahora GoodsIsSeS.GetSisEd () + ")/n,"); } // Construye la cadena SQL completa sql = prefix + suffix.substring (0, sufix.length () - 2); pst.addbatch (SQL); pst.executeBatch (); con.commit (); } con.setAutOcommit (true); // restaurar pst.close (); con.close (); } catch (Exception e) {E.PrintStackTrace (); Pruebe {// Transaction Rollback Con.Rollback (); con.setAutOcommit (verdadero); con.close (); } catch (sqlexception e1) {e1.printstackTrace (); }// Restaurar }}Asigne un código de compra (nuestro negocio necesita mostrar el código de compra al comprador, para que haya una devolución)
/** * Obtenga aleatoriamente el código de compra a través del producto emito_id (cada producto tiene un problema único por problema) (el código de compra utilizado se establecerá en el estado inválido) * @param emitesid * @param cantidad el número de códigos de compra que se obtendrá * @param useriDID * @return lotterynumber Objects * @author nifury 2016-7-22 */public List <Lotterynumber> queryNeDnewNeweNewid2 (LongiD2 (LongiSid2 (LongiSid, @author, Nifury Nifury, 7-22 *. cantidad, Long UserId) {List <Lotterynumber> NumberList = new ArrayList <Lotterynumber> (); intente {Long CurrentTime = System.CurrentTimemillis (); String updateUserId = "uply` lottery_number` set `status` = 0,` user_id` =?, `Current_time` =? int ROWNUM = JDBCTEMPLATE.UPDATE (updateUserId, userId, currenttime, emitsId, cantidad); if (Rownum> 0) {// Todavía hay códigos de compra válidos de izquierda a derecha? Object [] buyargs = {emitsID, userId, currenttime}; numberList = jdbctemplate.query (Query + "Where` emits_id` =? y `status` = 0 y` user_id` =? y `current_time` =?", buyargs, lotterynumberMapper); }} Catch (DeadLockLoserDataAccessException e) { System.out.println("------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.