EnvironmentHibernate сохраняет устаревшие данные с hibernate.jdbc.batch_versioned_data
Hibernate 4,2
ojdbc6 - Oracle 11.2.0.3.0 JDBC 4.0
Oracle Database 11g
Этот вопрос
Мы следовали за многими рекомендациями ations настроить наш спящий режим дозирования следующим образом:
<property name="hibernate.jdbc.batch_size">100</property>
<property name="hibernate.order_inserts">true</property>
<property name="hibernate.order_updates">true</property>
<property name="hibernate.jdbc.batch_versioned_data">true</property>
Мы проверили наши журналы, и мы увидели, что сгенерированные операторы SQL дозируют. Однако, если две транзакции одновременно изменяют одни и те же строки с версией сущностей, Hibernate успешно выполнит оба из них, что приведет к потере противоречивых обновлений в транзакции, совершившей последние (в обеих транзакциях сохраняются несогласные данные, поэтому последняя транзакция выходит из базы данных в несогласованном состоянии).
Удивительно, но документации по этому поведению очень мало. Hibernate официальный documentation говорит:
hibernate.jdbc.batch_versioned_data
Установите это свойство истинно, если ваш возвращает драйвер JDBC правильный подсчет строк из executeBatch(). обычно безопасен, чтобы включить эту опцию. Затем Hibernate будет использовать пакетный файл DML для автоматических версий данных. По умолчанию false.
Обычно безопасный? Мы почти отправили это на производство, прежде чем заметить, что все версии были нарушены.
Мы вышли из игры blog пять лет назад, которая описывает эту странность; очевидно, что Hibernate долгое время не делал этого.
Есть ли причина, по которой Hibernate ведет себя так? Он получает информацию от драйвера jdbc о том, что количество обновленных строк неизвестно, почему оно не выдает исключение, чтобы указать его, но скорее оставляет впечатление, что проверка версии прошла успешно?
у вас устали делая это ' истинный ' ложь? –
Babel