此链接: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 注释,那么为什么我的方法可以很好地工作,为什么我应该添加此注释。
更准确地说(在春季靴子中)之间有什么区别
@Transactional void addPerson () {// code that calls the DAO layer}
和
void addPerson () {// code that calls the DAO layer}
或者Spring boot会自动添加该注释,因此我们不需要将其添加到我们的服务中
答案 0 :(得分:0)
在您的API上的并发调用会相互影响时,您可以使用@Transcational
。
假设您要添加人员(您从某处检索数据,从数据中创建新的人员并将其添加到人员列表中)。假设要创建一个Person,您需要一个partner
属性,它是另一个Person。
在创建Person之前,您将通过id搜索伙伴,并将其添加到新的Person partner
属性中。但是,如果在所有这些查询过程中要删除的partner
被删除到某个地方(由于某些其他查询而在数据库中说)。您最终将没有所需的对象。
如果您使用@Transactional
,Spring将确保所有必需的数据都是安全的,直到交易结束。一旦结束,就会发生从partner
的删除请求,然后您将具有一些逻辑将其从新的 Person 对象中删除。但这会在之后发生。
您使用@Transactional
来确保“交易”的安全。
答案 1 :(得分:0)
默认情况下, SpringBoot 将spring.jpa.open-in-view
属性设置为true
的值,这意味着Spring为每个请求自动进行事务。
如果将此属性设置为false
,则必须用@Transactional
注释要初始化它的位置[Controller | Service | DAO]。