System.out.println("Main类事务名称(代理调用):"+ TransactionSynchronizationManager.getCurrentTransactionName());// 通过IOC获取 A 和 B 的代理对象//AService aService = applicationContext.getBean(AService.class);//BService bService = applicationContext.getBean(BService.class);//或者直接使用DI注入的...
public void processMain(String data, String log) { //这里一定不能使用this调用!!!this会导致获取的MainService这个对象,而非AOP后的MainService代理对象 //this.processAB(String data, String log); //需要通过ApplicationContext从IOC容器中获取AOP代理后的对象 MainService mainService = applicationContext.get...
虽然 Spring 搞了很多拦截器去增强目标方法,但实际执行被代理方法的时候还是靠目标对象去执行的(这也可以说明代理类是会持有被代理类的引用的),所以此时的 this 并不是代理对象,而是被代理对象,所以事务注解也就失效了。 上面主要是通过源码分析的角度来说明为啥 this 调用会造成事...
this导致事务失效的原因 当我们在一个事务中调用另一个对象的方法时,如果这个方法中使用了this关键字,事务可能会失效。这是因为this关键字代表当前对象的引用, 而事务是基于数据库连接的,每个数据库连接有自己的事务上下文。如果在一个事务中调用另一个对象的方法,而这个方法中使用了this关键字, 并且这个方法中开启了...
Spring事务失效的一种原因关于this调用的问题 PROPAGATION_REQUIRED: 如果存在一个事务,则支持当前事务。如果没有事务则开启事务; PROPAGATION_REQUIRES_NEW:总是开启一个新的事务。如果一个事务已经存在,则将这个存在的事务挂起; 问题: Spring中一个没有事务的方法A调用一个默认事务(PROPAGATION_REQUIRED)的方法B时,如...
今天与同事日常交流时,他说在service中使用this调用本类中@Transactional标注的方法该事务是不会生效的。原因是this调用的不是代理类中的方法而是非代理类中的方法。于是百度了一下,发现有很多人这么说。 我听了感觉很疑惑,众所周知,Spring在启动时会为@Component等或继承自该注解(@Controller、@Service...)的标注...
Spring中一个没有事务的方法A调用一个默认事务(PROPAGATION_REQUIRED)的方法B时,如果使用this调用方法B,方法B抛出RuntimeException,此时方法B事务未生效,不会回滚。 @ServicepublicclassEmployeeService{@AutowiredprivateEmployeeDao employeeDao;publicvoidsave(){try{this.saveEmployee();//此处this调用不会开启事务,数据...
* 内部调用新增方法 * * @param user */ @Override public void invokeInsertUser(User user) { this.insertUser(user); } AOP使用的是动态代理的机制,它会给类生成一个代理类,事务的相关操作都在代理类上完成。内部方式使用this调用方式时,使用的是实例调用,并没有通过代理类调用方法,所以会导致事务失效。
save(teacher1); //调用事务方法 this.saveREQUIRED2(); System.out.println("saveREQUIRED teacher1 成功..."); } @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED) public void saveREQUIRED2() { Teacher teacher2 = new Teacher(IdWorker.getId(), "REQUIRED...
因为在add方法中通过this.sub()调用时,本质上根本不会走代理对象的逻辑。所有调用都在目标对象内部完成...