2016-08-20 49 views
0

我有一個調用庫業務服務方法,我想知道我可以回滾transaction.Say例如的Java 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); 

} 

我要的是,當一個checked異常象一個SQL異常發生然後我希望既createOrder和reduceInventory都應該rollback.Say在創建訂單後,當我去reduceInventory,如果項目計數是負我不ant根據創建的順序。

在此先感謝

回答

1

我假設您在沒有關聯事務管理的Web層中使用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的異常被拋出,則整個交易將被回滾。

+0

哇我到底在找什麼,我在這裏到處搜索了2天,並沒有找到像你這樣的簡單例子。謝謝史蒂夫代碼儘可能寫得優雅:) – user3249433

0

可以使用的rollbackFor事務annoation的屬性來回滾上具體例外。 默認情況下,春季將回滾只在未經檢查的異常,但與這個屬性,你可以指定一個例外

@Transactional(的rollbackFor = Exception.class)

你可以看到這個帖子的詳細資料: Annotation @Transactional. How to rollback?

+0

因爲你使用JTA使用** rollbackOn **屬性代替 –

+0

我不使用彈簧我正在使用Java EE – user3249433

+0

任何這樣的例子,請儘量搜索,但沒有喜悅 – user3249433