2016-08-20 6 views
0

나는 저장소를 호출하는 비즈니스 서비스 방법을 가지고 내가 예를 들어 transaction.Say을 롤백 할 수있는 방법을 알고 싶어 내가 원하는 것은자바 EE JTA 트랜잭션 롤백

@Transactionl 
public class OrderService { 

@inject 
OrderRepository orderRepository; 

@inject 
InventoryRepository inventoryRepository; 

@inject 
Order order; 

@inject 
Item item; 

public Order createOrder (Order order) { 
    orderRepository.save(order); 
} 
public Item reduceInventory(Item item) { 
    inventoryRepository.update(item); 

} 

때 확인이 끝난 예외 등 SQL 예외가 발생하면 createOrder와 reduceInventory 둘 다 롤백해야합니다. itemsIndex가 음수이면 reduceInventory가 될 때 주문을 작성한 후 주문을 작성하지 않아도됩니다.

미리 감사

답변

1

관련 트랜잭션 관리가없는 웹 티어에서 OrderService을 사용한다고 가정합니다.

하나의 방법은 당신이 원자 할 필요가 코드를 실행하도록 사건을있는 것은 당신은 당신의 서비스 코드를 수정 고려해야 :

@Transactional(rollbackOn = { SQLException.class, PersistenceException.class }) 
public Order createOrder (Order order) { 
    orderRepository.save(order); 
    // I'm just guessing your update logic here: 
    for (Item item: order.getItems()) { 
     inventoryRepository.update(item) 
    } 
} 

rollbackOn 예외 중 하나가 전체 거래 후 발생하는 경우를 롤백됩니다. 당신은 JTA를 사용하고 있기 때문에

+0

와우 정확히 내가 뭘 찾고 있었는지 2 일 동안이 모든 곳을 검색하고 자신의 간단한 예제를 찾지 못했습니다. 감사합니다. 스티브 코드는 가능한 한 우아하게 작성되었습니다. :) – user3249433

0

에서 당신은 특정 예외에 롤백 트랜잭션의 annoation의 속성 rollbackfor 사용할 수 있습니다. 기본 스프링에 의해 에만 체크되지 않는 예외에 롤백하지만이 속성에 당신은 자세한 내용은이 게시물을 볼 수 있습니다

예외

@Transactional을 (rollbackFor = Exception.class)를 지정할 수 있습니다 : 를 Annotation @Transactional. How to rollback?

+0

이 rollbackOn이 ** 내가 검색이의 –

+0

속성하지만 기쁨 – user3249433

+0

모든 예 내가 시도하십시오 자바 EE를 사용하고 대신에 나는 봄을 사용하고 있지 않다 – user3249433