spring - 在哪里可以使用@Transactional

标签 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();
}
@Transactional
public void save() {
    Scenario scenar = new Scenario();
    sessionFactory.getCurrentSession().save(scenar);
}

谢谢!

最佳答案

Spring @Transactional 注释使用 Spring AOP 工作。这意味着,当包含带有该注释的方法的 bean 作为不同 bean 的依赖项注入(inject)时,它会被包装在代理中。该代理具有与 bean 相同的接口(interface),但在调用方法之前执行附加操作(在本例中将其包装在事务中)。您可以将其视为一种 decorator 。您甚至可以在调试应用程序时看到正在调用的代理。

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

More reading on Spring AOP proxies .

关于spring - 在哪里可以使用@Transactional,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31323536/

相关文章:

java - 将 Spring Boot 应用程序作为 Docker 镜像启动时无法解析配置类

java - Hibernate 和 Spring DataSourceTransactionManager

spring - Spring @Transactional 和 Spring Security @PreAuthorize 的顺序

java - Spring应用程序-在事务结束时运行方法?

spring - 将请求作用域的 Bean 从一个页面传递到另一页面

spring - 有没有办法跳过仅针对特定作业的 Spring Batch 持久元数据?

java - 一旦设置了 spring mvc 样板项目,python/RoR 的开发速度会更快吗?

spring - 显示与@MockBean 注释模拟的交互

database - Spring Propagation.REQUIRES_NEW 嵌套在 Propagation.NESTED 时的行为

java - 使用 Spring Test 执行 SQL 脚本正在提交更改