Heim  >  Artikel  >  Java  >  So verwenden Sie MyBatisPlus+SpringBoot, um die optimistische Sperrfunktion zu implementieren

So verwenden Sie MyBatisPlus+SpringBoot, um die optimistische Sperrfunktion zu implementieren

WBOY
WBOYnach vorne
2023-05-11 20:46:11841Durchsuche

    1. Szenario mit inkonsistenten Einkaufszentrumsdaten

    Wenn sich ein Produkt im Einkaufszentrum befindet, beträgt der Selbstkostenpreis 80 Yuan und der Verkaufspreis 100 Yuan. Der Manager teilte Xiao Li zunächst mit, dass er den Preis der Waren um 50 Yuan erhöhen sollte. Xiao Li spielte Spiele und hatte eine Stunde Verspätung. Genau eine Stunde später hatte der Manager das Gefühl, dass der Preis des Produkts auf 150 Yuan gestiegen sei, was zu hoch sei und den Umsatz beeinträchtigen könnte. Informieren Sie Xiao Wang außerdem darüber, dass Sie den Preis des Produkts um 30 Yuan reduzieren werden.

    Derzeit betreiben Xiao Li und Xiao Wang gleichzeitig das Produkt-Backend-System. Wenn Xiao Li in Betrieb ist, berechnet das System zunächst den Produktpreis von 100 Yuan. Xiao Wang ist ebenfalls in Betrieb und der Produktpreis beträgt ebenfalls 100 Yuan. Xiao Li erhöhte den Preis um 50 Yuan und speicherte 100+50=150 Yuan in der Datenbank; Xiao Wang reduzierte das Produkt um 30 Yuan und speicherte 100-30=70 Yuan in der Datenbank. Ja, wenn es keine Sperre gibt, wird der Betrieb von Xiao Li vollständig von Xiao Wangs übernommen.

    Der aktuelle Preis des Produkts beträgt 70 Yuan, was 10 Yuan niedriger ist als der Selbstkostenpreis. Innerhalb weniger Minuten waren schnell mehr als 1.000 Artikel dieses Produkts verkauft und der Chef verlor mehr als 10.000 Yuan.

    Zweitens demonstrieren Sie diesen Prozess

    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. Erstellen Sie eine Entitätsklasse

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

    4. Führen Sie einen Test durch 70 Yuan und die vom Manager erwarteten 120 Yuan, was zu einem Verlust führt. Wie kann verhindert werden, dass solche Anomalien auftreten? 3. Optimistisches Sperrschema

    Das Versionsfeld hinzufügen : Beim Abrufen des Datensatzes die aktuelle Version abrufen

    public interface ProductMapper extends BaseMapper<Product> {
        
    }

    Beim Aktualisieren Version + 1. Wenn die Version in der where-Anweisung falsch ist, schlägt die Aktualisierung fehl

    @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());
    	}
    }

    4. Optimistischer Sperrimplementierungsprozess

    1

    Annotation @Version hinzufügen

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

    2. Optimistisches Sperr-Plug-in hinzufügen

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

    3. Optimieren Sie den Prozess

    (Bestimmen Sie, ob die zweite Datenaktualisierung erfolgreich ist, wenn nicht, rufen Sie die Daten erneut zur Aktualisierung ab)

    @Version
    private Integer version;

    Das Ausgabeergebnis ist 120, die Daten sind korrekt

    Das obige ist der detaillierte Inhalt vonSo verwenden Sie MyBatisPlus+SpringBoot, um die optimistische Sperrfunktion zu implementieren. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

    Stellungnahme:
    Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen