Spring boot使用Jpa操作数据库时,如何实现行级锁?

发布于 2022-09-06 23:21:55 字数 730 浏览 22 评论 0

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

有个数据库表products,来管理所有产品的库存;
字段id为编号,是主键;
字段quantity是数量;
业务逻辑上会有产品出库和入库的情况,有一定的并发性,所以想使用行级锁;
然后,原本id=3的产品数量为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时,如果实现这些?我上网搜索,查到了下面的实现:

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

问题1.在实际使用时怎么用?
我的想法:我先调用findById(3),然后修改quantity后,save(products),是这样么?这样事物就完整提交了?
问题2.如果我调用findById(3)后,不调用save(products),会怎么样?
问题3.如果跟我在“问题1”里的想法不一样,应该是怎么弄?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

梦幻之岛 2022-09-13 23:21:55

手写语句+注解,mysql Innodb 自己会加行级锁,保证下面的语句线程安全,当然 前提是你的 id 有索引


@Modifying
@Query("update products sc set quantity = quantity -1 where sc.id = ?")
public void UpdateById(@Param(value = "ids") String id);
又爬满兰若 2022-09-13 23:21:55

这种情况下用乐观锁的方式会比较好

对应的sql

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

先把之前的库存取出来, 如果之时没有别人修改,会修改成功,否则可以重试,直到库存不再大于购买量为止。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文