鍍金池/ 問答/Java  數(shù)據庫  網絡安全/ Spring boot使用Jpa操作數(shù)據庫時,如何實現(xiàn)行級鎖?

Spring boot使用Jpa操作數(shù)據庫時,如何實現(xiàn)行級鎖?

·Spring boot 使用 jpa 操作 MySQL InnoDB;
·比如說:

有個數(shù)據庫表products,來管理所有產品的庫存;
字段id為編號,是主鍵;
字段quantity是數(shù)量;
業(yè)務邏輯上會有產品出庫和入庫的情況,有一定的并發(fā)性,所以想使用行級鎖;
然后,原本id=3的產品數(shù)量為2,我要出庫1個,要修改庫存為1,操作如下:

·我看到網上的sql語句是:

SET AUTOCOMMIT=0;//關閉自動提交
BEGIN WORK;//開始事物
SELECT quantity FROM products WHERE id=3 FOR UPDATE;
UPDATE products SET quantity = '1' WHERE id=3;
COMMIT WORK;//提交事物

·我在使用Jpa時,如果實現(xiàn)這些?我上網搜索,查到了下面的實現(xiàn):

@Lock(LockModeType.PESSIMISTIC_WRITE)  
public products findById(int id);

問題1.在實際使用時怎么用?
我的想法:我先調用findById(3),然后修改quantity后,save(products),是這樣么?這樣事物就完整提交了?
問題2.如果我調用findById(3)后,不調用save(products),會怎么樣?
問題3.如果跟我在“問題1”里的想法不一樣,應該是怎么弄?

回答
編輯回答
還吻

手寫語句+注解,mysql Innodb 自己會加行級鎖,保證下面的語句線程安全,當然 前提是你的 id 有索引


@Modifying
@Query("update products sc set quantity = quantity -1 where sc.id = ?")
public void UpdateById(@Param(value = "ids") String id);
2018年2月26日 04:44
編輯回答
孤客

這種情況下用樂觀鎖的方式會比較好

對應的sql

 update products  set quantity = quantity - :bye_count
  where id = :id and quantity=:old_value and quantity > :bye_count
 

先把之前的庫存取出來, 如果之時沒有別人修改,會修改成功,否則可以重試,直到庫存不再大于購買量為止。

2017年12月10日 08:04