org.springframework.orm.ObjectOptimisticLockingFailureException с драйвером microsoft, а не с драйвером jtds - PullRequest
0 голосов
/ 13 ноября 2018

Я получаю ObjectOptimisticLockingFailureException с пакетным обновлением, когда я использую драйвер Microsoft sqlserver (sqljdbc4.jar). Однако с тем же кодом, когда я переключаю драйвер на драйвер Jtds, я могу успешно выполнить пакетное обновление и вставку. мы используем базу данных sql server и JPA с Hibernate.

Вот что я делаю ниже.

  1. Получить данные из базы данных с кодом состояния в виде SUBMITTED и текущий флаг как Y.

  2. Пакетное обновление записей до текущего флага N, и Пакетная вставка новой записи с новым статусом BATCH_LOCKED.

  3. Пакетное обновление вышеуказанных записей снова с текущим флагом N и пакетная вставка новой записи со статусом ЗАВЕРШЕНО.

Все эти обновления проходят нормально. Когда транзакция совершается, я получаю исключение ниже

Я специально не определяю Оптимистическую блокировку, и я не определил аннотацию @Version для какого-либо столбца. Как происходит оптимистическая блокировка по умолчанию?

Если я прокомментирую Шаг № 3, тогда я не получу исключение.

Почему я не получаю исключение с драйвером JTDS?

org.springframework.orm.ObjectOptimisticLockingFailureException: Batch обновление вернуло неожиданное количество строк из обновления [1]; фактическая строка количество: 0; ожидается: 1; вложенное исключение org.hibernate.StaleStateException: пакетное обновление вернуло неожиданное количество строк от обновления [1]; фактическое количество строк: 0; ожидается: 1

1 Ответ

0 голосов
/ 13 ноября 2018

На шаге 3, когда вы пытаетесь обновить те же записи, значение было изменено на шагах 1 и 2. Поэтому вам нужно либо снова прочитать обновленные данные, а затем обновить их.

Оптимистическая блокировкаИсключение предотвращает потерянные обновления, и вы не должны игнорировать это.Вы можете просто перехватить его в обычном обработчике исключений и перенаправить пользователя в текущую начальную точку рабочего процесса, указывая, что произошло параллельное изменение, о котором он не знал.

...