S'il y a un produit dans le centre commercial, le prix de revient est de 80 yuans , et le prix de vente C'est 100 yuans. Le directeur a d'abord informé Xiao Li qu'il devait augmenter le prix des marchandises de 50 yuans. Xiao Li jouait à des jeux et a été retardé d'une heure. Exactement une heure plus tard, le directeur a estimé que le prix du produit avait augmenté à 150 yuans, ce qui était trop élevé et risquait d'affecter les ventes. Informez également Xiao Wang que vous réduirez le prix du produit de 30 yuans.
À l'heure actuelle, Xiao Li et Xiao Wang exploitent le système backend du produit en même temps. Lorsque Xiao Li fonctionne, le système retire d'abord le prix du produit de 100 yuans ; Xiao Wang fonctionne également, et le prix du produit retiré est également de 100 yuans ; Xiao Li a ajouté 50 yuans au prix et a stocké 100+50=150 yuans dans la base de données ; Xiao Wang a réduit le produit de 30 yuans et a stocké 100-30=70 yuans dans la base de données. Oui, s'il n'y a pas de verrou, l'opération de Xiao Li sera entièrement couverte par celle de Xiao Wang.
Le prix actuel du produit est de 70 yuans, soit 10 yuans de moins que le prix de revient. Quelques minutes plus tard, plus de 1 000 articles de ce produit ont été rapidement vendus et le patron a perdu plus de 10 000 yuans.
CREATE TABLE product ( id BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID', name VARCHAR(30) NULL DEFAULT NULL COMMENT '商品名称', price INT(11) DEFAULT 0 COMMENT '价格', version INT(11) DEFAULT 0 COMMENT '乐观锁版本号', PRIMARY KEY (id) ); INSERT INTO product (id, NAME, price) VALUES (1, '笔记本', 100);
@Data public class Product { private Long id; private String name; private Integer price; private Integer version; }
public interface ProductMapper extends BaseMapper<Product> { }
3. Solution de verrouillage optimiste
@RunWith(SpringRunner.class) @SpringBootTest public class ProductVersionTest { @Resource private ProductMapper productMapper; @Test public void testProductUpdate() { //1、小李 Product p1 = productMapper.selectById(1L); //2、小王 Product p2 = productMapper.selectById(1L); //3、小李将价格加了50元,存入了数据库 p1.setPrice(p1.getPrice() + 50); int result1 = productMapper.updateById(p1); System.out.println("小李修改结果:" + result1); //4、小王将商品减了30元,存入了数据库 p2.setPrice(p2.getPrice() - 30); int result2 = productMapper.updateById(p2); System.out.println("小王修改结果:" + result2); //最后的结果 Product p3 = productMapper.selectById(1L); System.out.println("最后的结果:" + p3.getPrice()); } }
SELECT id,`name`,price,`version` FROM product WHERE id=1
UPDATE product SET price=price+50, `version`=`version` + 1 WHERE id=1 AND `version`=1
@Version private Integer version;
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!