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.
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> { }
@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
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
@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!