2

我编写了一个应用程序,它一次从 Oracle Db 中的表中读取 1 条记录,对其进行一些处理,然后将其再次保存到同一个表中。我还在表中维护一个状态列,以跟踪我当前的记录进度。例如。在选择我将其更新为“U”并最后将其更改为“P”后,最初的记录状态为“N”。

现在我的问题是我想运行这个应用程序的许多实例,但是阻止程序是同一行可能被不同的实例选择,因为选择和更新状态到“U”不是一个单一的查询。所以它可能会发生进程 1 选择然后进程 2 选择相同然后记录Process1更新状态为'U'。我必须解决这个问题才能使我的应用程序分发。

我已经将选择和更新查询创建为单个事务,但我猜是因为这不能解决问题。我的这个逻辑是正确的吗?

我正在使用 Hibernate 访问数据库。任何人都知道如何使用 Hibernate java 来实现这一点?

如果我的上述逻辑(关于事务)是正确的,那么我可以通过两种方式来做到这一点,如果其中任何一种是由休眠提供的。

1-在 1 个查询中选择并更新记录

2-选择一行并将其锁定在 1 个查询中,然后在同一事务中运行另一个查询以将状态更新为 'U' 。在 Sql 中,我可以通过在查询结束时使用“for update”来做到这一点,但我不确定如何使用“Hibernate criteria”来做到这一点。Criteria 也有一个 API“forUpdate”,但我猜这不起作用,因为查询由在这种情况下,休眠最后没有“更新”。

有人可以帮我吗

4

1 回答 1

2

是的,可以使用条件进行一次查询。

我正在写一个例子。我希望它对你有帮助。

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();
}
于 2015-02-27T12:32:30.810 回答