Spring 在哪里可以使用@Transactional

Spring 在哪里可以使用@Transactional,spring,spring-transactions,Spring,Spring Transactions,有人能解释一下为什么会这样: @Transactional @Test public void test() { save(); } public void save() { Scenario scenar = new Scenario(); sessionFactory.getCurrentSession().save(scenar); } 这不会,因为它找不到事务: @Test public void test() { save(); } @Transact

有人能解释一下为什么会这样:

@Transactional
@Test
public void test() {
    save();
}
public void save() {
    Scenario scenar = new Scenario();
    sessionFactory.getCurrentSession().save(scenar);
}
这不会,因为它找不到事务:

@Test
public void test() {
    save();
}
@Transactional
public void save() {
    Scenario scenar = new Scenario();
    sessionFactory.getCurrentSession().save(scenar);
}

谢谢大家!

Spring@Transactional注释使用springaop工作。这意味着,当包含带有该注释的方法的bean作为另一个bean的依赖项被注入时,它将被包装在代理中。此代理与bean具有相同的接口,但在调用方法之前执行其他操作,在本例中,将其包装到事务中。你可以把它看作是一种。您甚至可以在调试应用程序时看到正在调用的代理

现在,当使用@Transactional注释的方法从同一个类调用时,至少没有简单的方法来注入代理。在Java中,根本没有办法替换this关键字引用的对象


.

由于您有一个注释为@Test的方法,我假设这是Junit测试类的一部分

Spring开发人员知道测试方法通常不实现接口,因此不能支持JDK代理。因此,它们特别支持@Test方法上的@Transactional注释。报告说:

启用和禁用事务
用@Transactional注释测试方法会导致测试在事务中运行,默认情况下,该事务将在测试完成后自动回滚。如果测试类用@Transactional注释,则该类层次结构中的每个测试方法都将在事务中运行。在类或方法级别未使用@Transactional注释的测试方法将不会在事务中运行。此外,带有@Transactional注释但传播类型设置为NOT_SUPPORTED的测试将不会在事务中运行。

我认为这是因为您使用的是标记为@Transactional的内部方法,这意味着@Transactional无效,因为该方法没有被spring代理,因为它没有标记为@Test。它不会提交您的事务!在测试中使用它是一个很好的做法,因为您可以测试save方法并保持数据库干净,从而不会破坏使用同一数据库的其他测试。这将是正确的答案。。。测试之外:-实际上,我认为SpringJUnit4ClassRunner构建了一个Spring上下文。我认为它还将测试作为bean从中检索。即使没有,行为实际上也没有那么不同: