次のコード サンプルでは:
Session session = getSessionFactory().openSession();
MyObject currentState = (MyObject)
session.get(MyObject.class, id, new LockOptions(LockMode.???));
if (!statusToUpdateTo.equals(currentState.getStatus())) {
tx = session.beginTransaction();
currentState.setStatus(statusToUpdateTo);
session.save(currentState);
tx.commit();
}
session.close();
コードからうまく解釈できると思いますが、アイデアはストアをチェックして、特定の ID を持つオブジェクトを見つけ、それを特定のステータスに更新することです。オブジェクトがすでに更新したいステータスになっていることがわかった場合は、何もしません。それ以外の場合は、ステータスを更新してストアに保存します。
私が心配しているのは、これらのリクエストのいくつかが一度に届き、すべてが同じオブジェクトを読み取って更新しようとした場合はどうなるかということです。doco を見ると、Hibernate は「通常、正確なロック レベルを自動的に取得する」ように見えます。(LockMode.class) ですが、オブジェクトを読み取り、更新する必要があると判断し、更新することができるのは 1 つだけであることを確認したいと考えています。他のスレッドが同じデータベース エントリに対して同じことを行う必要はありません。
LockMode クラスから、私が求めているのは PESSIMISTIC_WRITEだと思いますが、これを確認するドキュメント リソースが見つからないようです。誰かが私のためにこれを確認できますか?上記のコードは私が求めていることを実行しますか?