Spring管理事务@Transactional注解

Ton*_*oni 2 spring jpa transactions spring-transactions

传播设置是必需的。

@Transactional(propagation = Propagation.REQUIRED)
Run Code Online (Sandbox Code Playgroud)

事务是读/写的。

这些在什么场景下使用?请给我举例说明

Ata*_*nna 5

Spring事务默认是

@Transactional(propagation = Propagation.REQUIRED)
Run Code Online (Sandbox Code Playgroud)

因此您不需要指定传播属性。

那么,Spring 组件的注释意味着什么?@Transactional

  • Spring框架将启动一个新事务并执行所有方法,最后提交事务。

  • 但是如果Spring容器中不存在事务,application context那么Spring容器将启动一个新事务。

  • 如果配置了多个方法,则Propagation.REQUIRED事务行为以嵌套方式在逻辑上分配给每个方法,但它们都在同一物理事务下。

那么,结果是什么?
结果是,如果任何嵌套事务失败,则整个事务将失败并回滚(不要在数据库中插入任何值)而不是提交。

例子:

@Service
public class ServiceA{

    @Transactional(propagation = Propagation.REQUIRED)
    public void foo(){
        fooB();
    }

    @Transactional(propagation = Propagation.REQUIRED)
    public void fooB(){
        //some operation
    }

}
Run Code Online (Sandbox Code Playgroud)

说明 : 在此示例中,foo()方法分配了事务行为,并且在调用的foo()另一个方法内fooB()也是事务行为。这里的fooB()行为相当于嵌套事务foo()。如果fooB()由于任何原因失败,则foo()也无法提交。而是回滚。

  • 也许偏离主题,但我只是想指出,如果从 foo() 调用,fooB() 上的 @Transactional 注释不起作用,因为它绕过了负责事务管理的 spring 代理。/sf/answers/76949911/ (3认同)