java - 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
解决方案
您的问题是您可能正在
acct.version
增加acct.deposit(BigDecimal.ONE)
. 所以它变成了 100但是您不应该
version
自己增加字段,并且休眠将在刷新更新操作期间自动增加它。auto flush
到目前为止,在执行之前的会话中也可以休眠acctRepository.findByAcctNo("b")
。当它刷新时,它会忽略您手动执行的每个更新,account.version
并根据它在其会话中的内容自动增加它。在它的会话中,它会记住,它给了你版本 1,所以它将它增加 1 到 2 并刷新它。就在刷新之前,它会重置您放置的错误版本
推荐阅读
- reactjs - TurboModuleRegistry.getEnforcing(...):找不到“NativeReanimated”
- git - 从 git 历史记录中确定父分支/提交
- python - 熊猫,计算每组的值?
- image - GCP - Google Cloud Platform - 从快照问题创建实例
- validation - 验证字段以接受 Access 中的 PT 或 FT
- docker - Traefik 容器标签
- midi - 从停止的设备获取当前的 MIDI 时间码
- linux - 空间不足时暂停/暂停进程?
- c++ - 如何创建仅在一台计算机上运行 InnoSetup 的安装程序以防止未经授权的复制
- signalr - 具有 Signalr(服务器端风格)的 Blazor 应用程序在部署到 IIS 后返回错误请求