我有一个调用存储库的业务服务方法,我想知道如何回滚事务。例如
@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如果项目计数是负数我不要命令是创造了一切。
提前致谢
答案 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?