2016-08-20 86 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