gpt4 book ai didi

java - hibernate : Lock a row while update, 所以用户不会从中检索计数器

转载 作者:行者123 更新时间:2023-11-29 12:32:36 25 4
gpt4 key购买 nike

我正在开发一个 Spring-MVC 项目,在该项目中,我使用 Hibernate 作为 ORM,使用 PostgreSQL 作为我们的数据库,在我们的一个对象 (GroupCanvas) 中,我们有一个数字,每次用户执行某些操作时该数字都会递增,然后在数据库中更新GroupCanvas对象,它应该是唯一的。

我们目前遇到的问题是,如果多个用户在前端执行操作,其中一些用户会得到重复的数字。我们现在正在努力解决这个问题,以便稍后我们可以实现一个序列并确保这些数字是唯一的。

如何确保当我更新该行时,其他用户正在等待该行更新。我尝试了 LockMode.Pessimistic_write 和其他一些方法,但均无济于事。

代码:

  @Override
public void incrementNoteCounterForGroupCanvas(int canvasId) {
Session session = this.sessionFactory.getCurrentSession();
session.flush();
Query query = session.createQuery("update GroupCanvas as gc set gc.noteCount=gc.noteCount+1 where gc.mcanvasid=:canvasId");
query.setParameter("canvasId",canvasId);
query.executeUpdate();
session.flush();
}

@Override
public GroupCanvas getCanvasById(int mcanvasid) {
Session session = this.sessionFactory.getCurrentSession();
session.flush();
return (GroupCanvas) session.get(GroupCanvas.class, mcanvasid,LockMode.PESSIMISTIC_WRITE);
}

这两种方法都在 DAO 中,它有 @Transactional 注释,并且在服务层中也有注释。

谢谢。

最佳答案

如果“锁定”技术不太正确,请查看您发布的用法。为了让锁以您正在寻找的结果结束,操作顺序应该类似于下面的操作(简而言之,它类似于双重检查锁定,但使用数据库锁实现 - https://en.wikipedia.org/wiki/Double-checked_locking)。

  1. 开始交易(例如在您的服务方法上使用@Transactional注解)
  2. 使用 PESSIMISTIC_WRITE 锁定模式从数据库中检索实体(确保指示 hibernate 应该读取新副本而不是存储在 session 缓存中的副本)
  3. 如果需要,检查目标字段的当前值是否满足您的不变量
  4. 对字段执行更改/更新(例如,增加字段的值)
  5. 保存实体(如果不想等待自动刷新,请确保将值刷新到数据库)
  6. 提交交易(使用@Transactional时自动完成)

与发布的方法相比,此序列的本质区别在于在您的事务持有目标实体/数据库行上的锁时执行属性值的更新,从而阻止其他事务在更新过程中阅读它。

希望这对您有所帮助。

更新:我相信像下面的代码片段这样的东西应该能按预期工作:




@Transactional
@Override
public void incrementNoteCounterForGroupCanvas(int canvasId) {
final Session session = this.sessionFactory.getCurrentSession();
final GroupCanvas groupCanvas = session.get(GroupCanvas.class, canvasId,LockMode.PESSIMISTIC_WRITE);
session.refresh(groupCanvas);
groupCanvas.setNoteCount(groupCanvas.getNoteCount()+1);
session.saveOrUpdate(groupCanvas);
session.flush();
}

关于java - hibernate : Lock a row while update, 所以用户不会从中检索计数器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43229548/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com