2016-11-12 4 views
1

У меня есть два объекта: Message и Session. Message имеет отношение @ManyToOne к Session.проблема изоляции транзакций с пружинными данными

У меня есть хранилище и действие Spring Data A:

@Query("select c from Messages c where c.session.mode=0 and c.field=5") 
List<Messages> findMessages(); 

Затем я обрабатываю найдено данных

messages.ForEach(message->{ 
    Session session = message.getSession(); 
    sessionClose(session); 
    newSessionOpen(); 
}) 

и в другом классе обслуживания я имею

Session session=findOpenedSession(); 

Вопрос заключается в :

Что делать, если действие А в транзакции и после ее запуска и до ее окончания другая служба запросит открытый Session или попытается вставить запись в таблицу Message?

Другими словами, мы имеем:

  1. Сделка начинается
  2. записи считываются
  3. Session экземпляры обрабатываются в цикле - Session с использованием sessionClose и newSessionOpen
  4. сделка заканчивается

Что делать, если какой-либо другой процесс запросит открытый Session между 2 и 4 или 2 и 3 или где-нибудь внутри? Итак, который открыл Session, он будет читать? Старый или новый? Я использую postgres и @Transactional Весенняя аннотация.

+0

Вы полностью смутили меня. Когда вы говорите сеанс, вы имеете в виду объект jpa, который вы создали, или сеанс спящего режима? Или, может быть, иногда один, а иногда и другой? –

ответ

1

Предполагая, что «сессия» в вашем вопросе всегда относится к сущности, которую вы создали.

В соответствии с этим: https://www.postgresql.org/docs/9.1/static/transaction-iso.html уровень изоляции postgres по умолчанию предотвращает грязные чтения. Таким образом, никакая другая транзакция не сможет увидеть изменения, внесенные в вашу первую транзакцию, до тех пор, пока эта транзакция не завершится (т. Е. Заканчивается).

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

Смежные вопросы