我正在使用带有 Spring 启动和 JPA 的扳手数据库。我有一个要求,例如,每当从员工表中读取员工信息时,在事务完成之前,没有人可以读取/更新/删除相同的行信息。
我知道JPA中使用了“PESSIMSTIC_WRITE”锁。(在具有多个实例的应用程序上参考此链接JPA PESSIMSTIC_WRITE)
我尝试使用以下代码使用它,但它没有锁。当我尝试从其他实例中点击相同的查询时,它给出了结果。理想情况下,它应该等到第一个交易完成,但它仍然给出结果。
你能给我提出任何解决办法吗?
我用下面的代码来实现同样的目的。
@Repository
public interface EmployeeRepository extends JpaRepository<EmployeeEntity, Integer> {
@lock(LockModeType.PESSIMISTIC_WRITE)
@query("SELECT c FROM Employee c WHERE c.empId = :empId)
public EmployeeEnity getEmployee(@param("empId") Integer empId);
}
@Service
public class EmpService implement IEmpService {
@Autowired
EmployeeRepository empRepository;
@Transactional
@Override
public EmployeeEntity getEmployee(Integer empId) {
return empRepository.getClientId(clientId);
}
}
你是说你需要一把锁
在事务完成之前,没有人可以读取/更新/删除相同的行信息
对我来说,这听起来像是一个独家锁。这在Cloud Spanner中不可用。
问题是在这种情况下,这是否是您真正需要的。Cloud Spanner 中的读/写事务具有外部一致性。为了简要总结您的具体问题,这归结为以下内容:
Cloud Spanner保证在事务A提交的那一刻,R1的值仍然与步骤1中读取的值相同。如果您也有一个事务B,它几乎同时执行以下操作:
(所以两个事务都读取和修改同一个行)
然后保证这样做的效果将是事务 A 先执行,然后执行事务 B。或者事务 B 先执行,然后执行事务 A(也就是说,事务似乎是按顺序执行的。在所有情况下,两个事务都可以保证它们在步骤 1 中看到的值在提交时仍然未被任何其他人修改。
问题内容: 我正在使用Criteria API检索hibernate中的对象列表。但是,我需要锁定那些对象,因为同时执行的另一个线程将获得确切的对象,并且在没有悲观锁定的情况下,只有一个线程会成功。 我尝试如下,但它不起作用。 更新 :我正在执行此语句之后的更新,以便我希望两个线程都读取不同的行,或者至少第二个线程应该等到第一个线程完成事务并离开锁。 hibernate生成的查询如下。 更新 :这
我正在使用Spring Boot、JPA、Oracle 12C和下面的类型化查询来选择要处理的“新”项目。一旦我选择了“新”项目,我就会更新其状态,使其不再符合选择条件,但我看到一个并发问题,相同的项目被选中。 我在这里读到,我需要设置一个'LockModeType.PESSIMISTIC_WRITE'的查询,以防止其他线程选择相同的行,但它似乎不起作用。 我是否遗漏了下面的内容,或者我是否需要另
问题内容: 我在java下有spring项目,使用hibernate查询,我喜欢使用悲观锁定。 在Spring + Hibernate中如何进行悲观锁定? 编辑: 问题: 我想在一个方法中使用悲观锁定,并且我将此方法称为从不同的方法。当我从第一个方法调用它时,悲观的工作效果很好,但是当我从第二个方法调用它时,它给出了(无法提交事务) 例外: 问题答案: http://www.amicabile.c
我试图理解Hibernate中的悲观锁定机制(通过MySQL DB)。 我尝试运行以下示例: 但它并没有给我一个错误,而是执行得很好。是不是我误解了什么概念。这种行为正常吗? 我能够完美地测试乐观锁定,那么对于悲观锁定,是对概念有一些误解,还是我的代码缺少了一些东西。
编辑:在这种情况下,因为我使用了“版本”注释,所以我使用了乐观锁定,而不是悲观锁定。< br >如果我删除版本并因此禁用乐观锁定。悲观锁定会接管,性能会显著下降。< br >所以我想我必须忍受乐观锁定和偶尔的异常。有没有更好的解决办法? 原文:我目前通过ajp在apache 2.2负载均衡器中有多个Tomcat实例。后端系统处于Hibernate状态。该系统为多个用户和请求提供服务,对于请求,它会
我想测试是否工作,有人调用后,其他人调用应该是等待。 以下是我的最佳尝试,它不起作用。我认为原因是