Вам необходимо реализовать оптимистическую блокировку ручного режима.
Добавить столбец VERSION для каждой таблицы.
При загрузке и сущности .. вам нужно загрузить текущую версию
при обновлении сущности необходимо добавить проверку версии в предложении where и получить обновленный счетчик строк после выполнения (int rowCount = st.executeUpdate();
)
пример: UPDATE ACCOUNT set AMOUNT = x, VERSION = VERSION+1 where ID = XX and VERSION = CURRENT_VERSION
Если обновленный счетчик строк равен <> 1, это означает, что строка была изменена другой транзакцией (UPDATE или DELETE)