Spring boot使用Jpa操作数据库时,如何实现行级锁?
·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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
手写语句+注解,mysql Innodb 自己会加行级锁,保证下面的语句线程安全,当然 前提是你的 id 有索引
这种情况下用乐观锁的方式会比较好
对应的sql
先把之前的库存取出来, 如果之时没有别人修改,会修改成功,否则可以重试,直到库存不再大于购买量为止。