悲観的なロックを使用する必要があります。これは
によって実現できます。setLockMode(String alias, LockMode lockMode)
クエリでLockMode.UPGRADE
を使用します 。
ただし、このテーブルで多くのアクセスを行っている場合、これによりスケーラビリティとパフォーマンスが確実に失われます。シーケンスを使用するか、別の戦略を使用して、一度に100個の番号を取得し、データベースを更新して配布する番号を割り当てるサービス(SSBなど)を作成することをお勧めします。これにより、198のデータベースアクセスが節約されます。
更新:
また、テーブルのデザインを少し変更する必要があります。既知のIDを持つ単一の行を用意し、インクリメントする番号を別の列に格納することをお勧めします。次に、古い行を削除して新しい行を追加するのではなく、行を更新する必要があります。そうしないと、行ロック戦略が機能しません。
UPDATE2:
OPは、以下が機能することを発見しました:
session.get(class.Class, id, lockOption)