你是对的。
CrudRepository默认情况下,只有CRUD方法(方法)被标记为事务性的。如果使用自定义查询方法,则应在其上显式标记
@Transactional注释。
@Repositorypublic 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> {以及此处的一些交易方法:
@Transactionalpublic void deleteById(ID id) {@Transactionalpublic <S extends T> S save(S entity) {


