首页 > 解决方案 > spring jpa @version 在事务未提交之前自动更新版本

问题描述

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

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

它产生了脏数据。

在我查询数据库以获得同一张表之后。

jpa 自动更新脏数据的版本。但除了版本字段。其他字段没有更新。这让我感到困惑

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

标签: javaspringjpaversion

解决方案


  • 您的问题是您可能正在acct.version增加acct.deposit(BigDecimal.ONE). 所以它变成了 100

  • 但是您不应该version自己增加字段,并且休眠将在刷新更新操作期间自动增加它。

  • auto flush到目前为止,在执行之前的会话中也可以休眠acctRepository.findByAcctNo("b")。当它刷新时,它会忽略您手动执行的每个更新,account.version并根据它在其会话中的内容自动增加它。在它的会话中,它会记住,它给了你版本 1,所以它将它增加 1 到 2 并刷新它。就在刷新之前,它会重置您放置的错误版本


推荐阅读