当前位置: 首页 > 知识库问答 >
问题:

Spring数据Jpa@锁注释,带@事务

束作人
2023-03-14

根据java docs for@Lock Annotation:

用于指定执行查询时要使用的LockModeType的注释。在查询方法上使用Query或从方法名称派生查询时,将评估它。

如上所述,将使用@Query annotation或findBySomething对其进行评估。。()方法。

但根据我的发现,当我在任何方法中使用@Transactional放置@Lock注释,并在该事务方法中从db获取记录时,它正在获取db行的锁,理想情况下不应该(如果我错了,请纠正我):

我用两个事务T1和T2对此进行了验证,如下所示:

>

现在在具有相同@Lock的其他方法上启动T2,并使用悲观写入和@Transactional注释并获取相同的记录并尝试更新它们,但是当它尝试提交这些更改时,它会等待一段时间,然后抛出异常,说PessimticLock超时异常

@Transactional
@Lock(LockModeType.PESSIMISTIC_WRITE)
public boolean addInventory(Integer id){

   repo.findById(id)// #statement 1
}

此外,当调用#语句1时,它不会触发“选择更新”查询,而只会触发选择查询。

@Lock是否可以与@Transactional一起使用,并且在此事务下获取的所有行都可以获得锁?

使用SpringBoot版本2.1.4。发布

共有1个答案

唐啸
2023-03-14

我能够弄清楚我所面临的行为:

@Lock注解无效,如果它只使用@Transactional注解的方法,则使用@Query或findByXyz()方法。

在我的例子中,T2事务无法提交,因为数据库是MySQL,具有默认事务隔离级别“可重复读取”,在T1提交之前不允许继续T2事务。

@Lock(LockModeType.PESSIMISTIC_WRITE) //will not have any effect
@Transactional
public Response handleRequest(){
  //no lock will acquire
// prior to know about mysql's repeatble read, i was having impression, any call to db in this method will lock the db rows, which is wrong
}


@Lock(LockModeType.PESSIMISTIC_WRITE)// will fire select for update
@Transactional
public findByUserId(){

// any db call from repo layer which have no lock annotations 

}
@Lock(LockModeType.PESSIMISTIC_WRITE)// will fire select for update
@Query("select u from user as u where u.id=:id")
@Transactional
public getByUserID(String id){

}

 类似资料:
  • 我正在阅读使用Spring框架的事务管理。在第一个组合中,我使用Spring Hibernate和Hibernate的API来控制事务(Hibernate API)。接下来,我想使用注释进行测试,它确实起了作用。 我感到困惑的是: > JPA、JTA、Hibernate是否有自己的事务管理方式。举个例子,考虑如果我使用Spring Hibernate,在那种情况下,你会使用“JPA”事务吗? 就像

  • 我有以下JPA映射(为了简洁起见,getter和setter都是从代码中生成的,DDL可能起作用,也可能不起作用): 费用 类别 标签 与JpaRepository一起使用 所以我使用的是一个JPA假设,它看起来像这样: 当我使用JpaRepository的默认findAll()方法时,我得到一个n1选择问题: 但是,当我使用自己的findAllExpensesExploded()方法时,我得到一

  • 为什么测试用例需要@Transactional,其功能将在dao层中进行更新(JPA存储库),比如 当测试在没有@Transaction注释的情况下运行时,它会在行中给出以下异常 组织。springframework。刀。InvalidDataAccessApiUsageException:执行更新/删除查询;嵌套的异常是javax。坚持不懈TransactionRequiredException

  • 我正在使用spring数据jpa为我的服务实现多事务(数据库),带有两个持久的单元名。并在Jboss 6.4 EAP中部署 以下是我的服务详情 在Jboss中,我无法部署它,我遇到以下异常: 原因:org.springframework.beans.factory.BeanCreationException:无法自动装配字段:私有com.test.demo.domain.repository.Tb

  • 我正在使用Spring(3.1.4版本)和HibernateTemplate(3.6.7.Final)以及Spring数据JPA(1.3.0版本)。我在配置文件中定义了两个事务管理器,一个用于Hibernate,另一个用于Spring数据JPA。两个事务管理器使用不同的数据源。 我想在代码中使用Hibernate的事务管理器和Spring data JPA的事务管理器。(Spring文档链接-10

  • 我正在学习Spring Data JPA,在建立这两个表之间的关系时遇到了一些问题: 具有列id、name、product_type_id的产品表 product_type表,列id,名称 一个产品只能有一种类型。一个类型可以与许多产品相关联。 在我的实体类中,我将在哪里使用@OnetoMore和@ManytoOne注解?