差点中招-事务失效
2023-04-15 本文已影响0人
M_lear
一个spring bean中的方法加了Transactional注解,spring会为这个bean实例再创建一个代理对象,代理对象持有这个bean的引用。
当其他对象需要注入这个spring bean时,实际上注入的是这个bean的代理对象,这样spring事务就会生效。
差点中招
@Component
public class A {
@Scheduled(fixedRate = 3000)
public void doJob() {
handleExpiredOrder();
}
@Transactional(rollbackFor = Exception.class)
void handleExpiredOrder() {
}
}
上面这段代码的意图是,创建一个3s运行一次的spring定时任务,这个定时任务去调用被Transactional注解修饰的handleExpiredOrder方法。
这种情况spring事务是不会生效的,因为doJob调用的是A实例的handleExpiredOrder方法,而不是A实例代理对象的handleExpiredOrder方法。
应该这样
@Component
public class OrderService {
@Transactional(rollbackFor = Exception.class)
public void handleExpiredOrder() {
}
}
@Component
public class A {
@Autowired
private OrderService orderService;
@Scheduled(fixedRate = 3000)
public void doJob() {
orderService.handleExpiredOrder();
}
}
把事务代码移到一个单独的类中,通过spring注入的对象调用事务方法。