我仍然试图了解@Transaction如何运作。
我在Service类的方法上有@Transactional
注释,在Repository类的方法上有@Modifying
注释。具有@Transactional
注释的方法是否适用于具有注释@Modifying
的存储库中的方法?
我的理解:
对于@Transactional
类的方法,
@Transactional( readOnly = true )
没有数据写入数据库,而使用@Transactional
时,数据会写入数据库。
修改查询
- 修改方法签名只能返回
void
,Integer
或int
- 更新查询必须是交易式的,请使用
进行标记@Transactional
- Spring数据会删除
醇>EntityManager
中待处理的所有未刷新的更改,更改为@Modifying(clearAutomatically=false)
第二点说@Modifying
次查询必须@Transactional(readOnly=false)
,因此我们可以在@Service
级方法调用或@Repository
方法级调用中添加它。如果在@Service
级别添加,它也适用于@Respository
方法调用中调用的@Service
方法吗?
示例:
@Service
class AnimalServiceImpl implements AnimalService {
@Autowire
AnimalRepository animalRepository;
@Override
@Transaction
public void persistAnimal() {
....
animalRepository.save();
}
@Override
@Transaction(readOnly = true)
public void checkIfAnimalPresent() {
...
animalRepository.checkIfPresent();
}
@Override
@Transaction
public void deleteAnimal() {
...
animalRepository.deleteAnimal();
}
}
存储库
@Repository
@Transaction(readOnly=true)
public interface AnimalRepository extends org.springframework.data.repository.Repository {
@Modifying
@Query(...)
void save();
@Modifying
@Query(...)
int checkIfPresent()
@Modyfing
@Query(..)
int deleteAnimal();
}
我的问题在于:
@Transactional
才能在存储库@Repository
级别拥有@Modifying
并且方法@Transaction(readOnly =true)
修改实体并将其写入数据库(仅因为我在班级有@Transactional
)?@Repository
是否传播到[HttpDelete]
public ActionResult DeleteBranchMaster(int branchId)
{
//Deletion Logic.
}
类?我希望我的问题和例子非常清楚。
答案 0 :(得分:1)
@Transactional
的工作方式:
默认情况下,存储库实例上的CRUD方法是事务性的。
对于读取操作,事务配置readOnly
标志设置为true
。
所有其他文件都配置有普通的@Transactional
,以便应用默认的事务配置。
如果需要调整存储库中声明的方法之一的事务配置,则可以覆盖该方法,并使用必需的属性值添加@Transactional
批注。
另一种改变事务行为的方法是使用外观(或典型地)覆盖多个存储库的服务实现。
其目的是为非CRUD操作定义事务边界。
如果使用这种方法,则存储库中的事务配置将被忽略,因为外部事务(在服务层中定义)配置确定了实际使用的事务。
参考:Spring Data JPA - Reference Documentation - 5.7. Transactionality