Java EE JTA和事务回滚

时间:2016-08-20 07:02:23

标签: 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);

}

我想要的是当发生像SQL Exception这样的已检查异常时,我想要createOrder和reduceInventory都应该回滚。在创建订单后我去reduceInventory如果项目计数是负数我不要命令是创造了一切。

提前致谢

2 个答案:

答案 0 :(得分: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个异常,则将回滚整个事务。

答案 1 :(得分:0)

您可以使用Transactional annoation的rollbackfor属性来回滚特定的Exception。 默认情况下,spring仅在未经检查的异常时回滚,但使用此属性可以指定异常

  

@Transactional(的rollbackFor = Exception.class)

您可以在此帖子中找到更多信息: Annotation @Transactional. How to rollback?