Spring 为什么JPA修改查询需要@Transactional注释?
鉴于下面的代码,为什么当我从控制器调用Spring 为什么JPA修改查询需要@Transactional注释?,spring,hibernate,jpa,Spring,Hibernate,Jpa,鉴于下面的代码,为什么当我从控制器调用PersonService.updateAccountMembership时,我需要在@Modifying查询(AccountRepo.updateMembership)上添加@Transactional注释?调用修改查询的服务调用上的@Transactional注释是否足够(AccountService.updateMembership) 如果删除修改查询上的@Transactional注释,下面的代码将中断,但以下情况除外: javax.persiste
PersonService.updateAccountMembership
时,我需要在@Modifying
查询(AccountRepo.updateMembership
)上添加@Transactional
注释?调用修改查询的服务调用上的@Transactional
注释是否足够(AccountService.updateMembership
)
如果删除修改查询上的@Transactional
注释,下面的代码将中断,但以下情况除外:
javax.persistence.TransactionRequiredException: Executing an update/delete query
服务:
@Service
public class PersonService{
@Autowired
PersonRepo personRepo;
@Autowired
AccountService accountService;
public Person updateAccountMembership(Person person, int membership){
person = this.save(person);
accountService.updateMembership(person, membership);
}
@Transactional
public Person save(Person person){
return personRepo.save(person);
}
}
帐户服务:
@Service
public class AccountService {
@Autowired
AccountRepo accountRepo;
@Transactional
public void updateMembership(Person person, int membership){
accountRepo.updateMembership(person, membership);
}
}
账户回购:
public class AccountRepo extends JpaRepository<Account,Integer> {
@Transactional //WHY IS THIS REQUIRED????????
@Modifying
@Query("update .........")
void updateMembership(@Param("person") Person person, @Param("memb") int membership);
}
公共类AccountRepo扩展了JpaRepository{
@事务性//为什么需要这样做????????
@修改
@查询(“更新……”)
无效更新成员身份(@Param(“person”)person、@Param(“memb”)int成员身份);
}
当然可以
sql中有两种查询。读查询和写查询
一个数据库可以有多个客户端。如果两个客户同时更新一个人的性别怎么办?最后一个赢了
这是一个使用两种方法的示例:voidbuy()
和voidpay()
AccountService
的交易记录。调用this.save
也不是事务性的,因为它从不通过应用事务的代理。我认为提问者理解事务,但会问,在这种情况下,为什么配置的事务没有从服务层传播到存储库层。@AlanHay他描述的异常与我对话:他未通过服务层使用它。