Spring管理事务@Transactional注解

标签 spring jpa transactions spring-transactions

传播设置是必需的。

@Transactional(propagation = Propagation.REQUIRED)

事务是读/写的。

它们在什么场景下使用?请举例说明

最佳答案

Spring事务默认为

@Transactional(propagation = Propagation.REQUIRED)

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

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

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

  • 但是如果应用程序上下文中不存在事务,那么 Spring 容器将启动一个新事务。

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

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

示例:

@Service
public class ServiceA{

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

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

}

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

关于Spring管理事务@Transactional注解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46786651/

相关文章:

java - 您如何找出导致 CDI 事务回滚的异常?

java - 针对接口(interface)的 Autowiring 返回 null - Spring MVC

java - 对映射父类(super class)的引用

hibernate - JPA 鉴别器字段上的 Spring-Data Pageable 排序

java - Hibernate 和线程修改同一实体

c# - ADO.NET 在一个 sql 连接中重试事务

mysql - innodb 隔离级别和锁定

java - 通过我自己的 RESTful API 路由 API 调用是否被视为可接受的策略?

java - Spring Cloud Contract LocalDateTime 断言失败

Spring REST错误处理: Cannot have my custom message