Spring注解@Transactional在内部是如何工作的?

4 浏览
0 Comments

Spring注解@Transactional在内部是如何工作的?

我正在测试一些代码,并发现了一个有趣的情景。

情景:

public class ServiceA {
    public List saveAndGetAllV1() {
        serviceB.saveAll();
        return getAll();
    }
    public List saveAndGetAllV2() {
        serviceB.saveAll();
        return serviceB.getAll();
    }
    @Transactional(propagation = Propagation.MANDATORY)
    public List getAll() {
        repository.findAll();
    }
}
public class ServiceB {
    public void saveAll() {
        serviceC.saveAll();
    }
    public List getAll() {
        return repository.findAll();
    }
}
public class ServiceC {
    public void saveAll() {
        repository.saveAll(object);
    }
    @Transactional(propagation = Propagation.MANDATORY)
    public List getAll() {
        return repository.findAll();
    }
}

即使在serviceA.getAll()方法中,事务是必需的,saveAndGetAllV1()方法也不会出现任何错误。然而,另一方面,saveAndGetAllV2()方法会出错,因为serviceC.getAll()需要强制性事务。

所以我的问题是为什么在serviceA.getAll()方法中事务会自动创建,而在serviceC.getAll()方法中事务不会自动创建?

0
0 Comments

方法saveAndGetAllV1()在serviceA.getAll()方法中强制要求使用事务时,不会产生任何错误。

这是因为调用getAll()是一个本地调用,而不是使用代理,所以不会使用@Transactional

因此,即使我只添加了serviceA.getAll(),也没有任何意义,因为它只会在findAll方法级别上创建事务。正确吗?

是的。您需要对saveAndGetAllV1进行注解。

0