Два одновременных запроса, одна и та же сущность JPA - проблемы? - PullRequest
1 голос
/ 19 ноября 2011

Скажем, мой веб-сервер получает два одновременных запроса.

Он будет обрабатывать каждый запрос в отдельном потоке.

Он создаст диспетчер сущностей JPA для каждого потока.

Теперь предположим, что каждый поток запрашивает одну и ту же строку базы данных.Скажем, у меня есть стол под названием Автомобили.У меня есть машина с id = 5. Я делаю поиск для автомобиля с id = 5 в обоих потоках.

Итак, теперь у меня есть два отдельных объекта, представляющих одну и ту же сущность.

Теперь предположим, что я обновляю gasLevel автомобиля в потоке 1. Если я получу gasLevel в потоке 2, получу ли я новый gasLevel, установленный потоком 1?

1 Ответ

6 голосов
/ 19 ноября 2011

Нет, вы не будете, потому что, как вы сказали, у вас есть два разных экземпляра сущности.Если они оба обновят gasLevel на другое значение, тогда последний коммит победит.

Это одна из причин для реализации оптимистической блокировки с использованием поля версии, помеченного @Version: последняя фиксация завершится неудачно, потому что какая-то другая транзакция обновила значение между моментом загрузки объекта и моментом его новойсостояние сбрасывается.

Обратите внимание, что даже если поток 1 читает значение (7), изменяет его на 8, сбрасывает, а поток 2 затем читает значение, поток 2 все равно будет видеть 7 в случае по умолчанию, потому чтопо умолчанию используется уровень изоляции READ_COMMITTED.Это означает, что одна транзакция видит только те данные, которые были зафиксированы другими транзакциями.Это зависит от базы данных, хотя.Например, HSQLDB поддерживает только READ_UNCOMMITTED.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...