Maison > Java > javaDidacticiel > le corps du texte

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

WBOY
Libérer: 2023-05-11 20:46:11
avant
876 Les gens l'ont consulté

    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);
    Copier après la connexion

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

    @Data
    public class Product {
        private Long id;
        private String name;
        private Integer price;
        private Integer version;
    }
    Copier après la connexion

    4.Test

    public interface ProductMapper extends BaseMapper<Product> {
        
    }
    Copier après la connexion

    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());
    	}
    }
    Copier après la connexion
    #🎜 🎜#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
    Copier après la connexion

    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
    Copier après la connexion

    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;
    Copier après la connexion
    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!

    Étiquettes associées:
    source:yisu.com
    Déclaration de ce site Web
    Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
    Tutoriels populaires
    Plus>
    Derniers téléchargements
    Plus>
    effets Web
    Code source du site Web
    Matériel du site Web
    Modèle frontal