我编写了一个应用程序,它一次从 Oracle Db 中的表中读取 1 条记录,对其进行一些处理,然后再次将其保存到同一个表中。 我还在表中维护一个状态列,以跟踪我当前的记录进度。选择我将其更新为“U”后,最初记录状态为“N”,最后将其更改为“P”。
现在我的问题是我想运行此应用程序的多个实例,但阻止程序可能会被不同的实例选择同一行,因为选择并将状态更新为“U”不是单个查询。因此可能会发生 Process 1 select then Process2 选择相同的记录,然后 Process1 将状态更新为“U”。我必须解决这个问题才能使我的应用程序分布式。
我已经将选择和更新查询创建为单个事务,但我猜是因为这无法解决问题。我的这个逻辑是正确的吗?
我正在使用 Hibernate 访问数据库。任何人都知道如何使用 Hibernate java 实现这一目标?
如果我的上述逻辑(关于事务)是正确的,那么我可以通过两种方式来做到这一点(如果其中任何一种是由 hibernate 提供的)。
1-选择并更新 1 个查询中的记录
2-选择一行并将其锁定在 1 个查询中,然后在同一事务中运行另一个查询以将状态更新为 'U' 。在 Sql 中,我可以通过在查询结束时使用“for update”来做到这一点,但我不确定如何使用“Hibernate criteria”来做到这一点。Criteria 也有一个 API“forUpdate”,但我猜这不起作用,因为查询是由在这种情况下,Hibernate 最后没有“for update”。
有人可以帮我吗
最佳答案
是的,可以使用条件进行一次查询。
我正在写一个例子。希望对您有帮助。
public void updateEmployee(int empid,String firstname, String lastname, String email)
{
sf=connect(); // get connection
Session session=sf.openSession();
Transaction t=session.beginTransaction();
Employee emp= (Employee) session.get(Employee.class, empid);
emp.setFirstname(firstname);
emp.setLastname(lastname);
emp.setEmail(email);
session.update(emp); // Update employee
t.commit();
session.close();
}
关于java - 使用 java hibernate criteria API 作为单个查询进行选择和更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10789576/