Необходима ли синхронная синхронизация для переходных полей объекта JPA?

Мы знаем, что два потока, одновременно манипулирующие одним и тем же объектом, OptimisticLockException если применяются все значения по умолчанию. Что произойдет, если поле (поля), которым потоки манипулировали, было помечено аннотацией @Transient или модификатор transient?

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

Тем не менее, я погуглил все свои книги по Java EE и спецификации JPA 2.0, но не могу найти эту "проблему" устраненной. Это говорит мне, что я, должно быть, что-то здесь упускаю и что я чрезмерно волнуюсь??

1 ответ

Решение

OptimisticLockException будет использоваться только в том случае, если в сущности есть поле @Version и если транзакция пытается сохранить сущность, которая была изменена другой транзакцией с момента загрузки состояния сущности.

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

JPA действительно полностью игнорирует переходные поля. Но я не понимаю, как синхронизация может что-то изменить, так как каждый поток имеет свой экземпляр сущности. Более того, в большинстве корпоративных приложений несколько JVM используют одну и ту же базу данных, поэтому синхронизация здесь не помогает. Откровенно говоря, использование переходных полей в объектах обычно показывает проблему проектирования, и полагаться на состояние переходного поля в объекте для хранения состояния, совместно используемого несколькими потоками, совершенно неверно. Если состояние совместно используется несколькими потоками или даже процессами, его, вероятно, следует сохранить в базе данных.

Другие вопросы по тегам