2013-09-05 4 views
0

У меня возникла проблема с откатом транзакций, используя аннотацию @Transactional.Как откат транзакции весной

У меня есть следующие методы в backingbean, услуг и дао классов:

public class ItemBackingBean { 
    public void saveUpdate() { 
     try { 
      ItemService.executeTransaction(); 
     } 
     catch(Exception e) { 
     } 
    } 
} 

public class ItemService { 
    @Transactional(propagation = Propagation.REQUIRES_NEW) 
    public void executeTransaction() { 
     deleteItem(); 
     createOrder(); 
    } 

    private void deleteItem() { 
     persist(); 
    } 

    private void createOrder() { 
     persist(); 
    } 

    private void persist() { 
     JpaDaoImpl.persist(object); 
     JpaDaoImpl.update(object); 
    } 
} 

public class JpaDaoImpl implements JpaDao { 
    @Transactional(readOnly = true) 
    public persist(Object object) { 
     getEm().persist(object); 
    } 

    @Transactional(readOnly = false, propagation = Propagation.REQUIRED) 
    public void update(Object object) { 
     getEm().merge(object); 
    } 

    @Transactional(readOnly = true) 
    public void remove(Object object) { 
     getEm().remove(object); 
    } 
} 

Если какое-либо исключение происходит в CreateOrder(), все операции должны откатить, но это не происходит. Может ли кто-нибудь сказать мне проблему?

Какое влияние @Transactional в JpaDaoImpl.java? Методы persist() и update() имеют разные значения radOnly. Этот Дао - это существующий код в нашем проекте, и мы не хотим его менять. Может ли кто-нибудь помочь?

С уважением, Банду

+0

Сообщений конфигурации и убедитесь, что вы используете базу данных, которая поддерживает транзакцию (MySQL с Таблицы MyISAM не поддерживают транзакции). '@ Transactional' на dao в принципе ничего не делает (если ваша конфигурация верна),' @ Transactional' на службе имеет приоритет. –

+0

, если db является MySQL, таблицы должны использовать движок InnoDB. – vijay

+0

Моя база данных - это Oracle. На другом экране откат работает нормально. –

ответ

0

Если какое-либо исключение происходит в CreateOrder(), все операции должны откатить, но это не происходит. Может ли кто-нибудь сказать мне проблему?

Откат происходит только для RuntimeExceptions (см http://docs.spring.io/spring/docs/2.0.8/reference/transaction.html «Пожалуйста, обратите внимание, что код транзакционной инфраструктуры Spring Framework, будет, по умолчанию, только пометить транзакцию для отката в случае выполнения, непроверенные исключения;»), но это настраиваемое поведение

вы можете сохранить распространение транзакций по умолчанию, который PROPAGATION_REQUIRED без влияния на существующий код, если вы хотите все или ничего поведение на

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