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()

  • 客户端A读取下一个空发票号000000 1
  • 客户端B读取下一个空发票号0000001
  • 客户端A将发票0000001付款人更改为最大值
  • 客户A商店发票0000001
  • 客户B将发票0000001付款人更改为Tom

  • 客户端B存储发票0000001不需要它,但是请确保实际应用了
    AccountService
    的交易记录。调用
    this.save
    也不是事务性的,因为它从不通过应用事务的代理。我认为提问者理解事务,但会问,在这种情况下,为什么配置的事务没有从服务层传播到存储库层。@AlanHay他描述的异常与我对话:他未通过服务层使用它。