2

Oracle Db のテーブルから一度に 1 つのレコードを読み取り、その上で何らかの処理を行ってから、同じテーブルに再度保存するアプリケーションを作成しました。また、現在の記録の進捗状況を追跡するために、テーブルにステータス列を維持しています。最初のレコード ステータスは、[更新中] を選択すると [N] になり、最後に [P] に変更されます。

今私の問題は、このアプリケーションの多くのインスタンスを実行したいということですが、ブロッカーは同じ行が別のインスタンスによって選択される可能性があります。これは、ステータスを選択して「U」に更新することは単一のクエリではないためです。記録してから、Process1 のステータスを 'U' に更新します。アプリケーションを配布するには、この問題を解決する必要があります。

単一のトランザクションとして選択および更新クエリを作成しましたが、それでは問題が解決しないためだと思います。このロジックは正しいですか?

Hibernate を使用してデータベースにアクセスしています。Hibernate Java を使用してこれを達成する方法を知っている人はいますか?

上記のロジック(トランザクションについて)が正しい場合、これらのいずれかが休止状態によって提供されている場合、2 つの方法でこれを行うことができます。

1-1 つのクエリでレコードを選択して更新する

2-行を選択して1つのクエリでロックし、同じトランザクションで別のクエリを実行して、ステータスを 'U' に更新します。Sqlでは、クエリの最後に「for update」を使用してこれを行うことができますが、「Hibernate criteria」を使用してこれを行う方法がわかりません.CriteriaにはAPI「forUpdate」もありますが、クエリがによって生成されたため機能しないと思いますその場合の休止状態には、最後に「更新用」がありません。

誰かがこれで私を助けてくれますか

4

1 に答える 1

2

はい、条件を使用して 1 つのクエリに可能です。

一例を書いています。お役に立てば幸いです。

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 に答える