【问题标题】:@Transactional in spring boot春季启动中的@Transactional
【发布时间】:2020-02-02 15:22:31
【问题描述】:

此链接:https://www.quora.com/When-should-Spring-Boot-methods-use-the-Transactional-annotation

解释清楚@Transactional在做什么,但是我还是不明白Spring Boot方法什么时候应该使用这个注解:

例如:

我有这个方法:

void addPerson () {// code that calls the DAO layer}

我的方法在没有 @Transactional 注释的情况下也能很好地工作,那么为什么我应该添加这个注释。

更准确地说(在 spring boot 中)有什么区别:

@Transactional void addPerson () {// code that calls the DAO layer}

void addPerson () {// code that calls the DAO layer}

或者Spring boot会自动添加这个注解,所以我们不需要将它添加到我们的服务中

【问题讨论】:

    标签: hibernate spring-boot jpa transactions spring-data-jpa


    【解决方案1】:

    默认情况下SpringBootspring.jpa.open-in-view属性设置为true值,这意味着Spring会自动为每个请求进行事务处理。

    如果将此属性设置为false,则必须用@Transactional 注释要初始化它的点[Controller|Service|DAO]。

    【讨论】:

      【解决方案2】:

      当您的 API 上的并发调用可能相互影响时,您使用 @Transcational

      假设您要添加一个 Person(您从某处检索数据,从数据中创建一个新的 Person 并将其添加到人员列表中)。假设要创建一个 Person,您需要一个 partner 属性,它是另一个 Person。

      在创建 Person 之前,您将通过 Id somehwere 搜索合作伙伴并将其添加到新的 Person partner 属性。但是,如果在所有这些查询期间,您想要添加的partner在某处被删除(假设由于其他查询而在数据库中)。您最终将得不到您请求的对象。

      如果您使用@Transactional,Spring 会确保所有必需的数据都是安全的,直到 Transaction 结束。一旦结束,来自partner 的删除请求就会发生,然后您将有一些逻辑将其从新的 Person 对象中删除。但这会在之后发生。

      您使用@Transactional 来确保您的“交易”安全。

      【讨论】:

      • 感谢您的回复,它解释了注释@Transactional 的用途,但我的问题不是“为什么要使用它”我的问题是在 SPRING BOOT “我们什么时候应该添加它”,因为我认为 Spring Boot 通过在某处自动添加此注释来使交易安全
      猜你喜欢
      • 2015-09-18
      • 2015-01-22
      • 2017-09-25
      • 2015-10-06
      • 2015-12-11
      • 2013-11-12
      • 2019-05-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多