2012-01-02 2 views
0

Я использую hibernate и Spring для управления транзакциями.Не может показаться, что изоляция READ COMMITTED work

В настоящее время у меня есть объект Foo, который я хочу прочитать из базы данных, прежде чем обновлять его. Что-то вроде этого

@Transactional(isolation = Isolation.READ_COMMITTED) 
public void update(Foo beingUpdated) { 
    Foo beforeUpdate = fooDao.read(beingUpdated.getId()); 

    checkDifferences(beingUpdated, beforeUpdate); 
    fooDao.update(beingUpdated); 
} 

, но моя проблема в том, что, когда я прочитал Foo, возвращаемый объект является один обновляется, не совершил. Я не понимаю, как использовать изоляцию? Как я могу прочитать объект, переданный в базе данных, а не тот, который обновляется?

Цените любую помощь.

+1

, который зависит от используемой СУБД - разные РСУБД реагируют по-разному на один и тот же параметр изоляции ... еще один момент: до тех пор, пока вы читаете и обновляете внутри того же сеанса/соединения, вы всегда получаете текущее значение, даже если он еще не зафиксирован ... – Yahia

+0

В настоящее время я использую Oracle. Есть ли способ, которым я могу получить объект, занесенный в базу данных, даже на том же сеансе? Мне нужно проверить эти различия, потому что мне нужно передать его другому сервису. –

+0

, если это вообще возможно, с некоторой комбинацией триггера и, возможно, AQ, возможно, вместе с некоторыми хранимыми процедурами ... – Yahia

ответ

2

Вот некоторые варианты для вас:

  1. Перечитайте объект в другой сессии, возможно, используя метод с аннотацией @Transactional(propgation=REQUIRES_NEW), который даст вам новую сессию для этого метода. Это добавляет накладные расходы DB: вам нужно будет повторно загрузить объект.
  2. Погрузитесь в внутреннюю часть Hibernate, используя что-то вроде PostUpdateEvent.getOldState().
  3. Сэкономьте, что вас интересует с LoadEventListener. Если вы поместите информацию в переходные поля, вы можете получить к ней доступ позже.

Ни один из этих вариантов не является приемлемым, но я успешно использовал 1 и 3 в нескольких местах.

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