Spring Boot With @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...............
这是一个以某种方式说明我的问题的示例:
服务A class
@Service
public class ServiceA {
public void nonTransactionalMethodA(Book book) {
//..... Any independent logic from ServiceB
updateAuthor(book);
nonTransactionalMethodB();
}
public void nonTransactionalMethodB() {
//post process logic ......
}
}
服务 B Class
@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
并由不同的 class.
调用
事务方法必须是 public 以便 Spring 可以覆盖它并且必须从定义 class 之外调用它以便调用可以通过代理。
这是使用@Transactional 时的常见陷阱之一,有关详细信息,请参阅https://codete.com/blog/5-common-spring-transactional-pitfalls/
我正在尝试在 @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...............
这是一个以某种方式说明我的问题的示例:
服务A class
@Service
public class ServiceA {
public void nonTransactionalMethodA(Book book) {
//..... Any independent logic from ServiceB
updateAuthor(book);
nonTransactionalMethodB();
}
public void nonTransactionalMethodB() {
//post process logic ......
}
}
服务 B Class
@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
并由不同的 class.
事务方法必须是 public 以便 Spring 可以覆盖它并且必须从定义 class 之外调用它以便调用可以通过代理。
这是使用@Transactional 时的常见陷阱之一,有关详细信息,请参阅https://codete.com/blog/5-common-spring-transactional-pitfalls/