Оптимистичная блокировка Spring Data JPA с устаревшей DB2 / 400 - PullRequest
0 голосов
/ 09 октября 2019

Я пишу новый код для обновления устаревшей БД AS400 / iSeries / IBMi (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

Мне бы очень хотелось, чтобы был способ использовать строку выборасменить функцию токена в качестве версии. Любые идеи приветствуются.

Заранее спасибо.

1 Ответ

0 голосов
/ 30 октября 2019

После долгих исследований я думаю, что ответ заключается в том, что это невозможно.

Функция 'токен изменения строки' довольно интересна, но (насколько я могу заметить) бесполезна. Для DB2 / 400, по крайней мере, при изменении записи «токен изменения строки» будет действительно увеличиваться на 1. Однако несколько других записей также увеличатся на 1 одновременно. Это можно увидеть, если перечислить все записи, упорядоченные по убыванию «токена изменения строки». Первоначально все «токены изменения строки могут быть равны 0, обновите запись и выполните листинг заново, и для набора записей их« токен изменения строки »будет равен 1. Кроме того, кажется, что« сброс маркера изменения строки может быть получен, возможно, на IPL ». или другое событие типа машины.

Похоже, это происходит потому, что записи хранятся внутри на страницах, а «токен изменения строки» должен действительно быть «токеном изменения страницы». Таким образом, хотя может показаться, что это работает, если другой пользователь обновил другую запись на той же странице, тогда код может подумать, что запись была изменена, а на самом деле это не так, просто соседняя запись.

Я по существу решилпроблема с использованием старомодного метода. Я не уверен, есть ли у него имя, но я собираюсь назвать его «Довольно оптимистичная блокировка». Если мне нужно обновить некоторые поля в записи, я сначала сохраняю старые значения, а затем использую старые значения в предложении 'where' в обновлении, чтобы обновление не было выполнено, если оно изменилось. Это может означать много параметров в операторе обновления, но это работает.

...