春季启动中的@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】:默认情况下SpringBoot将spring.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的主要内容,如果未能解决你的问题,请参考以下文章