我们在Spring中是否需要@Transaction和@Modifying注释?

时间:2018-01-18 05:36:19

标签: java spring

我仍然试图了解@Transaction如何运作。

我在Service类的方法上有@Transactional注释,在Repository类的方法上有@Modifying注释。具有@Transactional注释的方法是否适用于具有注释@Modifying的存储库中的方法?

我的理解:

  对于@Transactional类的方法,

@Transactional( readOnly = true )没有数据写入数据库,而使用@Transactional时,数据会写入数据库。

修改查询

  
      
  1. 修改方法签名只能返回voidIntegerint
  2.   
  3. 更新查询必须是交易式的,请使用@Transactional
  4. 进行标记   
  5. Spring数据会删除EntityManager中待处理的所有未刷新的更改,更改为@Modifying(clearAutomatically=false)
  6.   

第二点说@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();
}

我的问题在于:

  1. 为什么我们在服务类中需要@Transactional才能在存储库@Repository级别拥有@Modifying并且方法@Transaction(readOnly =true) 修改实体并将其写入数据库(仅因为我在班级有@Transactional)?
  2. Service类上的注释@Repository是否传播到[HttpDelete] public ActionResult DeleteBranchMaster(int branchId) { //Deletion Logic. } 类?
  3. 我希望我的问题和例子非常清楚。

1 个答案:

答案 0 :(得分:1)

@Transactional的工作方式:

默认情况下,存储库实例上的CRUD方法是事务性的。
对于读取操作,事务配置readOnly标志设置为true
所有其他文件都配置有普通的@Transactional,以便应用默认的事务配置。
如果需要调整存储库中声明的方法之一的事务配置,则可以覆盖该方法,并使用必需的属性值添加@Transactional批注。

另一种改变事务行为的方法是使用外观(或典型地)覆盖多个存储库的服务实现。
其目的是为非CRUD操作定义事务边界。

如果使用这种方法,则存储库中的事务配置将被忽略,因为外部事务(在服务层中定义)配置确定了实际使用的事务。

参考:Spring Data JPA - Reference Documentation - 5.7. Transactionality