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
异常,则整个事务将被回滚。
我有一个调用存储库的业务服务方法,我想知道如何回滚 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
异常,则整个事务将被回滚。