Maison >Java >javaDidacticiel >Comment utiliser MyBatisPlus+SpringBoot pour implémenter la fonction de verrouillage optimiste

Comment utiliser MyBatisPlus+SpringBoot pour implémenter la fonction de verrouillage optimiste

WBOY
WBOYavant
2023-05-11 20:46:11936parcourir

    1. Scénario avec des données incohérentes du centre commercial

    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.

    2. Démontrez ce processus

    1 Ajouter une table de produits à la base de données

    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);

    2. #🎜 🎜#3. Créer un mappeur

    @Data
    public class Product {
        private Long id;
        private String name;
        private Integer price;
        private Integer version;
    }

    4.Test

    public interface ProductMapper extends BaseMapper<Product> {
        
    }

    Le résultat final est de 70 yuans, ce qui est différent des 120 yuans attendus par le manager, ce qui donne une perte. Comment éviter cela ? Lorsqu'une exception se produit, la solution est d'utiliser le verrouillage optimiste

    3. Solution de verrouillage optimiste

    Ajouter un champ de version à la base de données : quand en récupérant l'enregistrement, obtenez la version actuelle

    @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());
    	}
    }
    #🎜 🎜#Lors de la mise à jour, version + 1, si la version dans l'instruction Where est incorrecte, la mise à jour échoue

    SELECT id,`name`,price,`version` FROM product WHERE id=1

    4. processus d'implémentation

    1. Modifier la classe d'entité# 🎜🎜#

    Ajouter une annotation @Version

    UPDATE product SET price=price+50, `version`=`version` + 1 WHERE id=1 AND `version`=1

    2.

    3. Optimiser le processus

    (Jugement n° Si la deuxième mise à jour des données est réussie, sinon, récupérez les données pour la mise à jour)

    @Version
    private Integer version;

    Le le résultat de sortie est 120, les données sont correctes

    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!

    Déclaration:
    Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer