Spring 事务失效场景

170 阅读1分钟

数据库引擎不支持事务

MySql 的 MyISAM 引擎不支持回滚,如果需要自动回滚事务,需要将MySql的引擎设置成InnoDB;

方法不是 public 修饰符

@Transactional
void test1() {
   ResOrder resOrder = new ResOrder();
   resOrder.setOrderNo(123);
   orderDomain.save(resOrder);
   int a = 1/0;
   ResProduct resProduct = new ResProduct();
   resProduct.setProductName("商品");
   productDomain.save(resProduct);
}
// 订单成功入库,商品未入库, 事务失效

非public修饰的方法,spring无法生成动态代理

方法被final、static 修饰

@Transactional
public final void test1() {
   ResOrder resOrder = new ResOrder();
   resOrder.setOrderNo(123);
   save(resOrder);
   int a = 1/0;
   ResOrder resOrder1 = new ResOrder();
   resOrder1.setOrderNo(1234);
   save(resOrder1);
}
// 订单成功入库,商品未入库, 事务失效

方法被final修饰,那么在它的代理类中,就无法重写该方法,从而无法实现事务。当然被static 修饰也不行。