Spring Boot中的@Transactional

5
这个链接: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会自动添加这个注解,所以我们不需要在服务中添加它。
2个回答

11

当您的API上的并发调用会互相影响时,可以使用@Transactional

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

在创建一个人员之前,您需要在某个地方通过ID搜索合作伙伴,并将其添加到新的人员partner属性中。但是,如果在所有这些查询过程中,您计划添加的partner已被删除(例如由于某个其他查询在数据库中),那么您最终将无法获取所请求的对象。

使用@Transactional,Spring会确保所有必需的数据在事务结束之前是安全的。一旦事务结束,来自partner的删除请求将发生,然后您将执行一些逻辑以将其从新的人员对象中删除。但是这将在事务结束后才会发生。

您可以使用@Transactional来确保“事务”安全。


谢谢您的回复,它更详细地解释了注释@Transactional的用途,但我的问题不是“为什么使用它”,而是在SPRING BOOT中“何时应该添加它”,因为我认为Spring Boot通过在某个地方自动添加此注释来使事务安全。 - Abdessattar NOISSI
我认为在较新的SpringBoot版本3.0.4以上,默认情况下它是true,除非您明确将其设置为false。 - Dennis

-1

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

如果您将此属性设置为 false,则必须在您想要初始化它的地方 [Controller|Service|DAO] 上注释 @Transactional


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接