如何在 Spring Boot 中使用 @Transactional 注解

Posted

技术标签:

【中文标题】如何在 Spring Boot 中使用 @Transactional 注解【英文标题】:How to use @Transactional annotation in Spring boot 【发布时间】:2019-09-20 14:57:56 【问题描述】:

我正在做一个 spring-boot 项目。

在我的项目中使用@Transactional注解之前,我有两个问题

    在spring-boot、服务层或DAO层使用@Transactional注解的最佳实践?

    如果是服务层,那么我应该在哪里使用 @Transactional 注释在一个类或该类中的方法上?

【问题讨论】:

***.com/questions/1079114/… & ***.com/questions/26491688/… 的可能重复 @DEBENDRADHINDA 2 个问题没有得到回答,实际上这两种情况都有 2 个赞成的答案 【参考方案1】:
    在服务层:你希望你的整个业务方法都是 ACID 如果您希望所有 bean 方法都是事务性的,则在类上;如果您希望特定方法是事务性的,或者具有不同的事务性属性,则在方法上

【讨论】:

【参考方案2】:
    在Service layer 中使用@Transactional,因为DAO 层不应包含业务逻辑

Service 层可能调用不同的 DAO 来执行 DB 操作。让我们假设一个服务方法中有 3 个 DAO 操作的情况。如果您的第一个 DAO 操作失败,其他两个可能仍会通过,您最终会出现不一致的数据库状态。注释服务层可以帮助您避免这种情况。

    在方法级别使用它,因为类级别的用处不大,因为它强制所有方法(以及未来的方法/子类)都是事务性的

在类级别,此注释默认应用于声明类及其子类的所有方法

【讨论】:

@Transactional 注释适用于类级别,但它给出错误“org.hibernate.AssertionFailure: 可能对会话进行非线程安全访问”我的数据库表上应用了触发器。 @ShahanawajMulla 请用相关代码提出一个新问题

以上是关于如何在 Spring Boot 中使用 @Transactional 注解的主要内容,如果未能解决你的问题,请参考以下文章

在spring boot中进行单元测试之前,通过data.sql文件向h2数据库中插入数据

Spring Cloud 任务的 SimpleTaskConfiguration 和 Spring Batch 的 SimpleBatchConfiguration 防止 Spring Boot 自动

如何在 spring-boot 中禁用 spring-data-mongodb 自动配置

如何在 Spring Boot 中使用 @Transactional 注解

如何在 Spring Boot 中使用 Spring Security 启用 CORS

如何在 Spring Boot 中使用 Spring Security 配置 CORS? [复制]