spring 事务未提交前jpa @version 自动更新版本

spring jpa @version auto update version before transaction uncommited

下面是我的代码。 Acct 对象有一个字段版本,我使用了@version 注释。

我猜是因为我没有提交交易。

它产生了脏数据。

并且在我查询数据库后 table。

jpa 自动更新脏数据的版本。 但除了版本字段。其他领域不是update.it让我感到困惑

saveFlush 将解决问题。但是太慢了!

// open transaction
            Acct acct = acctRepository.findByAcctNo("a");
            System.out.println("version1:" + acct.getVersion()); // 1
            for(int i = 0; i < 100 ; i ++) {
                acct.deposit(BigDecimal.ONE);
            }
        
            System.out.println("version2:" + acct.getVersion()); // 100  
            Acct acctOther = acctRepository.findByAcctNo("b");
            
            System.out.println("version3:" + acct.getVersion()); // 2  other info is equal with version2
// commit transaction
  • 您的问题是您可能在 acct.deposit(BigDecimal.ONE) 中递增 acct.version。所以它变成了 100

  • 但是您不应该自己递增 version 字段,hibernate 会在刷新更新操作期间自动递增它。

  • Hibernate 也 auto flush 在会话中执行 acctRepository.findByAcctNo("b") 之前的任何内容。当它刷新时,它会忽略您手动对 account.version 进行的每个更新,并根据其会话中的内容自动递增它。在它的会话中,它会记住,它给了你版本 1,所以它将它递增 1 到 2 并刷新它。就在刷新之前,它会重置你输入的不正确版本