当前位置: 首页 > 面试题库 >

Spring JPA存储库事务性

羊舌阎宝
2023-03-14
问题内容

关于Spring JPA存储库事务性的1个快速问题。我有未标记为事务性的服务,并调用了Spring JPA存储库方法

userRegistrationRepository.deleteByEmail(email);

它被定义为

@Repository
public interface UserRegistrationRepository extends JpaRepository<UserRegistration, Long> {

    UserRegistration findByEmail(String email);

    void deleteByEmail(String email);

}

问题是它失败,并且“ 没有EntityManager,当前线程没有可用的实际事务-
无法可靠地处理’remove’调用;嵌套异常是javax.persistence.TransactionRequiredException
“异常。

好的,我可以通过将服务 deleteByEmail(..)
方法标记为事务性来解决此问题,但是我不明白为什么它现在会崩溃。Spring文档明确指出“ 默认情况下,存储库实例上的CRUD方法是事务性的。
”(http://docs.spring.io/spring-
data/jpa/docs/current/reference/html/#transactions),但显然这是一个是不是…所以这个陈述只与的成员有关CrudRepository吗?

ps:那是针对Spring Data JPA 1.9.4的


问题答案:

你是对的。CrudRepository默认情况下,只有CRUD方法(方法)被标记为事务性的。如果使用自定义查询方法,则应在其上显式标记@Transactional注释。

@Repository
public interface UserRegistrationRepository extends JpaRepository<UserRegistration, Long> {

    UserRegistration findByEmail(String email);

    @Transactional
    void deleteByEmail(String email);

}

您还应该注意标记存储库接口方法而不是服务方法的后果。如果您使用默认的事务传播配置(Propagation.REQUIRED),则:

然后,由于外部事务配置确定实际使用的配置,因此将忽略存储库中的事务配置。

http://docs.spring.io/spring-
data/jpa/docs/current/reference/html/#transactions

如果您需要有关其实现方式的更多信息,请查看默认值CrudRepository/ JpaRepository实现-
SimpleJpaRepository(您可能正在使用):

https://github.com/spring-projects/spring-data-
jpa/blob/master/src/main/java/org/springframework/data/jpa/repository/support/SimpleJpaRepository.java

有趣的行在这里:

@Transactional(readOnly = true)
public class SimpleJpaRepository<T, ID> implements JpaRepositoryImplementation<T, ID> {

以及此处的一些交易方法:

@Transactional
public void deleteById(ID id) {



@Transactional
public <S extends T> S save(S entity) {


 类似资料:
  • 关于Spring JPA存储库事务性的1个快速问题。我有一个未标记为事务性的服务,并调用Spring JPA存储库方法 好的,我可以通过标记服务或deleteByEmail(..)来解决它方法作为事务性的,但我就是不明白为什么它现在会崩溃。Spring文档明确指出“存储库实例上的CRUD方法在默认情况下是事务性的。”(http://docs.spring.io/spring-data/jpa/do

  • 我有一个用例,我需要从一个Kafka主题中消费,做一些工作,生成另一个只有一次语义的Kafka主题,并保存到mongo数据库。看完文档后,我想kafka事务和mongo事务可以同步,但它们仍然是两个不同的事务。在下面的场景中,如果mongo提交失败,是否有方法回滚提交到主题并从消费者处重播的kafka记录。

  • 本文向大家介绍事务存储器,包括了事务存储器的使用技巧和注意事项,需要的朋友参考一下 事务性内存起源于数据库理论,它为进程同步提供了另一种策略。 内存事务是原子的,是一系列内存读写操作。如果事务中的所有操作都已完成,则将提交内存事务。否则,必须中止操作并回滚。可以通过添加到编程语言中的功能来获得事务存储的便利性。考虑一个例子。假设我们有一个修改共享数据的函数。传统上,此功能将使用互斥锁(或信号量)编

  • 最近,我注意到Spring Data JDBC,所以我决定在一个新的Spring Boot(2.3.1)应用程序中使用它。在我的用例中,我有一个包含两类表的DB模式: 用于存储应用程序(更复杂的)业务逻辑所使用的实体的表。我使用Spring Data JPA(带有底层Hibernate)来处理它们。 表,用于存储彼此之间没有太多关系的简单数据记录(例如来自外部系统的数据记录)。我决定对它们使用Sp

  • 本文向大家介绍MSSQL事务的存储过程,包括了MSSQL事务的存储过程的使用技巧和注意事项,需要的朋友参考一下 在酒店管理系统开发中,我们会创建房间表和房间类型表(房型表)这两个表,如下图所示: 房型表:RoomType             房间表:Room   首先这两个表的关系:Room是从表,RoomType是主表,两表有主外键关系,RoomType.rTypeId=Room.rType

  • 下述存储引擎支持事务: ·InnoDB:通过MVCC支持事务,允许COMMIT、ROLLBACK和保存点。 ·NDB:通过MVCC支持事务,允许COMMIT和ROLLBACK。 ·BDB:支持事务,允许COMMIT和ROLLBACK。