2016-01-02 3 views
0

1-Как обрабатывать исключения в транзакции? Я пытаюсь что-то вроде этого:Весна. сомнения по поводу транзакций

@Transactional(propagation = Propagation.REQUIRES_NEW) 
method1(){ 
    ... 
    while(iter.hasNext()){ 
     ... 
     try{ 
      service2.method11(); 
     }catch (Throwable t){ 

     } 
    } 


} 

Способ 11 может вызвать исключения. Я бы хотел, чтобы metodo11 исключил исключение, а затем прервал metodo11. Но не откатывайте весь метод транзакции1.

2-Как каждый запрос выполняется в транзакции? я определяю услуги следующим образом:

@Service 
@Transactional 
public class Service1 ... 

Является ли это правильный путь?

3-Могу ли я принудительно сохранить элемент до окончания транзакции? В Repository я определил запрос вроде следующего:

public List<Person> getOldsPet(){ 
    return em.createQuery("SELECT p FROM Pet Where p.birthday = (SELECT MIN (p2.birthday) FROM Pet p2)").getResultList() 
} 

, если у меня есть следующий код:

Person person1 = new Person(); 
... 
Pet pet1 = new Pet(); 
pet1.setPerson(person1); 
... 
person1.getPets().add(pet1); 
... 
personRepo.create(person1); 
List<Pet> olds = petRepo.getOldsPet(); 

«getOldsPet()» метод не может найти Pet1, который был недавно создан.

Люди класса выглядит следующим образом:

@Entity 
@Table (name = "person") 
@Audited 
public class Person implements Serializable { 
    ... 
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "person") 
    private List<Pet> pets; 

Извините за мой английский. Спасибо за любые советы

+2

Просто используйте [соответствующее свойство] (HTTP: //docs.spring.io/spring/docs/current/javadoc-api/org/springframework/transaction/annotation/Transactional.html#noRollbackForClassName--) в аннотации. Либо, если вы не хотите откатываться от конкретного исключения, установите этот класс; или поймать все исключения и повторить в качестве определенного типа. –

+1

Вы задали 3 отдельных вопроса в одном Вопросе. Он «слишком широк». Пожалуйста, отредактируйте его, чтобы задать только один вопрос, а затем отправить остальных в качестве отдельных Вопросов. (Если вы этого не сделаете, ваш вопрос скорее всего будет закрыт.) –

ответ

2

Как обрабатывать исключения при совершении операции?

В конфигурации по умолчанию код транзакционной инфраструктуры Spring Framework, только помечает транзакцию для отката в случае выполнения, непроверенные исключения; то есть, когда брошенное исключение является экземпляром или подклассом RuntimeException. (Error s также - по умолчанию - результат откат). Проверенные исключения, которые выбрасываются из транзакционного метода , не приводят к откату в конфигурации по умолчанию.

Вы можете настроить, какие именно Exception типы пометить транзакцию для отката, в том числе проверяемых исключений с помощью rollbackFor и noRollbackFor свойств:

@Transactional(rollbackFor=MyException.class, noRollbackFor=AnotherEx.class) 

Вы можете указать возможное вбрасывание в состоянии исключения от method11 в noRollbackFor собственности или поймать и проглотите его, как вы делали в своем примере.

Как каждый запрос выполняется в транзакции?

Spring рекомендует только аннотацию конкретные классыметоды конкретных классов) с @Transactional аннотацию, в отличие от аннотирования интерфейсов. Вы, безусловно, можете разместить аннотацию @Transactional на интерфейсе (или на интерфейсе), но это работает только так, как вы ожидали бы, если будете использовать прокси-серверы на основе интерфейса.Тот факт, что аннотации Java не наследуются от интерфейсов, означает, что если вы используете прокси-классы на основе классов (proxy-target-class="true") или аспект на основе ткачества (mode="aspectj"), то параметры транзакции: не признаны инфраструктурой проксирования и ткачества объект не будет завернут в транзакционный прокси, что было бы явно плохо.

Это правильный путь?

Вы можете аннотировать свои классы и общедоступные методы с помощью аннотации @Transactional. При таком расположении весна обычно начинает транзакцию в начале вашего транзакционного метода (не всегда, основываясь на вашем атрибуте propagation) и фиксирует его в конце текущего метода.

Примечание: При использовании прокси, вы должны применять @Transactional аннотацию только к методам с общественной видимости.

Могу ли я принудительно сохранить элемент до окончания транзакции? В Repository я определил запрос вроде следующий:

Я думаю, вы могли flush лежащие в основе Session или EntityManager содержимого в хранилище данных, прежде чем пружина совершает сделку

+0

Большое спасибо! У меня есть некоторые сомнения ** 1) ** Нужно ли мне metodo11 работать как новая транзакция? Потому что мне нужен откат метода11, но не метод1. ** 2) ** Нужен ли мне класс @Transactional и метод? Одного из двух недостаточно? – user60108

+1

Если ваш метод «method11» имеет некоторый эффект транзакции, который вы хотите откат в случае конкретного исключения, я предполагаю, что метод должен работать в своей собственной транзакции. –

+1

Когда вы добавляете '@ Transactional' в класс, все методы' public' этого класса будут транзакционными, поэтому вам не нужно комментировать все методы, если вы не собираетесь уточнять некоторые атрибуты транзакций на уровне метода –

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