【发布时间】:2018-06-27 02:57:10
【问题描述】:
我仍在尝试了解 @Transactional 的工作原理。
我在 Service 类的方法上有 @Transactional 注释,在 Repository 类的方法上有 @Modifying 注释。 @Transactional注解的方法是否适用于Repository中注解@Modifying的方法?
我的理解:
@Transactional在具有@Transactional( readOnly = true )的类的方法上不会将数据写入数据库,而在使用@Transactional时,会将数据写入数据库。
修改查询
- 修改方法签名只能返回
void、Integer或int- 更新查询必须是事务性的,用
@Transactional标记- Spring Data 将删除
EntityManager中的所有未刷新更改,更改为@Modifying(clearAutomatically=false)
正如第二点所说,@Modifying 查询必须有@Transactional(readOnly=false),所以我们可以在@Service 级别的方法调用或@Repository 方法级别的调用中添加它。如果在@Service 级别添加,它也适用于从@Service 级别方法调用中调用的@Respository 方法?
例子:
@Service
class AnimalServiceImpl implements AnimalService {
@Autowire
AnimalRepository animalRepository;
@Override
@Transactional
public void persistAnimal() {
....
animalRepository.save();
}
@Override
@Transactional(readOnly = true)
public void checkIfAnimalPresent() {
...
animalRepository.checkIfPresent();
}
@Override
@Transactional
public void deleteAnimal() {
...
animalRepository.deleteAnimal();
}
}
存储库
@Repository
@Transactional(readOnly=true)
public interface AnimalRepository extends org.springframework.data.repository.Repository {
@Modifying
@Query(...)
void save();
@Modifying
@Query(...)
int checkIfPresent()
@Modifing
@Query(..)
int deleteAnimal();
}
我的问题是:
- 当我们在存储库
@Repository级别拥有@Transactional而我在方法上有@Modifying时,为什么我们需要在服务类中使用@Transactional修改实体并将其写入数据库(仅因为我在类级别有@Transactional(readOnly = true))? - Service 类上的注解
@Transactional是否会传播到@Repository类?
我希望我对这里的问题和示例非常清楚。
【问题讨论】:
-
你不是很清楚(恕我直言)。是的,即使使用
@Modifying修改数据时,您也需要@Transactional,这只是一个注释,让 Spring Data 知道您有一个@Query可以更改内容。@Transactional标记事务的开始和结束。如果你把它放在你的服务层中,从一个方法中调用的所有东西都参与了同一个事务。如果你不该单个方法中的每个调用都将成为它自己的事务。 -
感谢您的澄清。我有最后一个问题,我已经在存储库级别有事务注释(但是 readOnly=true)。当我修改我的查询并且我在服务级别没有事务但我在存储库级别有一个 readOnly = true 时会发生什么,实体会在数据库中写入/更新吗?当我不小心忘记使用事务注释来注释服务级别方法时,它以某种方式对我有用。我是 string、jpa 和 hibernate 的新手,所以请耐心等待。:)
标签: java spring transactions spring-transactions