春季启动中的@Transactional

Posted

技术标签:

【中文标题】春季启动中的@Transactional【英文标题】:@Transactional in spring boot 【发布时间】: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会自动添加这个注解,所以我们不需要将它添加到我们的服务中

【问题讨论】:

【参考方案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 通过在某处自动添加此注释来使交易安全

以上是关于春季启动中的@Transactional的主要内容,如果未能解决你的问题,请参考以下文章

春季启动数据休息中的日期问题

春季启动中的@value没有从application.properties中提供价值

春季启动中的休眠统计信息不起作用?

春季启动查询以单独从子文档数组中的字段中获取最大值

Maven的验证上启动和每个班级停止春季测试运行

春季启动Tomcat终止