Java EE JTA 和事务回滚

Java EE JTA and transaction rollback

我有一个调用存储库的业务服务方法,我想知道如何回滚 transaction.Say 例如

@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 异常之类的已检查异常时,如果项目计数是否定我根本不反对要创建的订单。

提前致谢

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

@Transactional(rollbackFor=Exception.class)

您可以查看此 post 了解更多信息: Annotation @Transactional. How to rollback?

我假设您正在使用 OrderService 来自没有关联事务管理的 Web 层。

既然如此,那么您应该考虑修改您的服务代码,以便单个方法执行您需要原子化的代码:

@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 异常,则整个事务将被回滚。