【问题标题】:Entity/row is updated only sometimes with Spring/Hibernate?实体/行仅有时使用 Spring/Hibernate 更新?
【发布时间】:2017-12-11 14:52:07
【问题描述】:

每当有人“打开”设备时,我有一个表会更新(带有时间戳和 user_id)。此设备表也是包含 device_ids、device_names 等的“核心”表。我已使用 Spring 中的 @Transactional 标记方法,并且我将“设备”表标记为实体。

我希望当我更改实体时,由于方法被标记为事务,当方法关闭时,数据库将被更新。但这并不(总是)发生。我检查了服务器的日志,没有看到 SQL 异常。 catalina.out 看起来不错,MySQL 错误日志也是如此。这里可能是什么问题?我应该在此方法结束之前显式保存更新的实体吗?

【问题讨论】:

  • DeviceProfile entities会在你调用DeviceProfileRepository的save方法时被保存
  • @gtosto,好吧,出于好奇,为什么实体“有时”会更新,但不会一直失败? (另外,尝试保存Device 而不是DeviceProfile
  • 你能把你的方法发给getDevice()吗?
  • 可能在应用程序的另一部分刷新了休眠会话,或者保存了与device相关的其他实体
  • @CrazySabbath 使用 getDevice() 方法更新

标签: java mysql spring hibernate


【解决方案1】:

是的,所以这最终成为两个线程的竞争条件问题。由于一个线程会在 Spring 中使用 @Transactional 注释启动一个事务,然后另一个线程会启动,所以它们在某一时刻都有相同的数据,但一个通常稍后提交,给人的印象是行锁定的问题。某处有一个合理的解决方案,无论是强制您的事务具有不同的隔离级别,例如:Serializable 用于接触同一行的方法,还是仅使用类似 @DynamicUpdate 的方式更新实体,但它们都有优点在尝试修复像我遇到的一些奇怪的竞争条件时,应该考虑 /cons 和两者。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-24
    • 1970-01-01
    • 2017-08-16
    • 2019-02-09
    • 2017-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多