使用旧版DB2 / 400的Spring Data JPA乐观锁定

问题描述 投票:0回答:1

我正在编写新代码以更新旧版AS400 / iSeries / IBMi DB(DB2 / 400)。我不能改变桌子。我知道Spring Data JPA可以通过@Version批注使用开放式锁定,但这需要表中的现有字段进行批注。

DB2 / 400已经具有一项功能,每次更新记录时该功能都会增加,例如:

select row change token for mylib.table1 from mylib.table1 where someid=123

我正在使用(来自我的application.properties文件):

spring.datasource.driver-class-name=com.ibm.as400.access.AS400JDBCDriver
spring.jpa.database-platform = org.hibernate.dialect.DB2400Dialect

我真正想要的是有一种使用“选择行更改令牌”功能作为版本的方法。任何想法最欢迎。

提前感谢。

java spring-data-jpa db2 db2-400 optimistic-locking
1个回答
0
投票

经过大量研究,我认为答案是不可能的。

“行更改令牌”功能非常有趣,但(据我所知)无济于事。对于DB2 / 400,至少如果更改了一条记录,“行更改令牌”的确会增加1。但是,其他几条记录也会同时增加1。如果列出所有按“行更改令牌”降序排列的记录,则可以看到。最初,所有“行更改令牌”都可能为0,更新一条记录并再次列出,一堆记录的“行更改令牌”为1。而且,“行更改令牌”似乎已重置,也许是在IPL或其他机器类型的事件。

这似乎是因为记录内部保存在页面中,并且“行更改令牌”实际上应该是“页面更改令牌”。因此,尽管这似乎可行,但是如果另一个用户在同一页面上更新了另一条记录,则代码可能会认为一条记录实际上已经没有被更改,而只是一条相邻的记录。

我基本上已经使用老式方法解决了该问题。我不确定它是否有名称,但是我将其命名为“ Fairly Optimistic Locking”。如果需要更新记录中的某些字段,那么我先保存旧值,然后在更新的“ where”子句中使用旧值,以便如果更改了任何内容,更新将失败。它可能意味着update语句上有很多参数,但它可以工作。

© www.soinside.com 2019 - 2024. All rights reserved.