簡體   English   中英

Spring Boot 使用@Transactional 注解方法,調用其他事務性方法並拋出異常

[英]Spring Boot With @Transactional annotated method, calls other transactional methods and throws an Exception

我正在嘗試在@Transactional注釋方法中處理記錄。 在處理其他一些次要(但必要)的業務邏輯之前,必須注意其他方法的一些依賴性。 主記錄似乎在事務內部沒有問題地保存,但是當我嘗試使用其他服務清理一些數據時,它會拋出一個JpaEntityNotFoundException

我在導致問題的方法中使用了Propagation.REQUIRES_NEW ,但沒有成功。 有沒有人知道我錯過了什么或做錯了什么? 在執行其余的事務操作之前,我不能提交主記錄。

我得到的例外是: org.springframework.orm.jpa.JpaObjectRetrievalFailureException: Unable to find com.myproject.repository.entity.Book with id 5851445; nested exception is javax.persistence.EntityNotFoundException: Unable to find com.myproject.repository.entity.Book with id 5851445............... org.springframework.orm.jpa.JpaObjectRetrievalFailureException: Unable to find com.myproject.repository.entity.Book with id 5851445; nested exception is javax.persistence.EntityNotFoundException: Unable to find com.myproject.repository.entity.Book with id 5851445...............

這是一個以某種方式顯示我的問題的示例:

服務A類

@Service
public class ServiceA {


    public void nonTransactionalMethodA(Book book) {

        //..... Any independent logic from ServiceB

        updateAuthor(book);

        nonTransactionalMethodB();
    }

    public void nonTransactionalMethodB() {
        //post process logic ......
    }

}

服務B類

  @Service
  public class ServiceB {

        @Autowired
        private BookRepository bookRepository;

        @Autowired
        private OfferRepository offerRepository;

        @Transactional
        private void updateAuthor(Author author) {
            Book book = new Book(1);
            book.setAuthor(author);
            bookRepository.save(book);
            removeUnavailableOffers(book);        
        }

        @Transactional(propagation = Propagation.REQUIRES_NEW)
        public void removeUnavailableOffers (Book book) {
            /*throwing org.springframework.orm.jpa.JpaObjectRetrievalFailureException: Unable to find com.myproject.repository.entity.Book with id 5851445; nested exception is javax.persistence.EntityNotFoundException: Unable to find com.myproject.repository.entity.Book with id 5851445............*/
            offerRepository.deleteByBookIdIsNullAndBookAuthorIdNot(book.authorId);            
        }
    }   

對此的任何想法將不勝感激。

確保使用@Transactional注釋的方法聲明為public並由不同的類調用。

事務方法必須是公共的,以便 Spring 可以覆蓋它,並且必須從定義類的外部調用它,以便調用可以通過代理。

這是使用@Transactional 時常見的陷阱之一,有關更多信息,請參閱https://codete.com/blog/5-common-spring-transactional-pitfalls/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM