入力に基づいて永続化された Schedule オブジェクトを返すサービスがあります: 日付。このメソッドを呼び出す複数のスレッドがあり、一意性を確保したいと考えています。制約違反をキャッチして、ユーザーにエラーを与えたくありません。必要なのは、あるスレッドがメソッドを呼び出し、その日付の Schedule オブジェクトが存在しない場合、そのスレッドがそれを作成し、他のスレッドが待機することです。Spring を使用する前に、Web アプリケーションで単純に Hibernate を次のように実行しました。
休止状態で ManagedSessionContext を使用しました。各 Web リクエストの最初にトランザクションを開始し、最後にコミットしていました。同期ブロックについては、同期ブロックで現在のトランザクションをすぐにコミットし、新しいトランザクションを開始してリクエストを完了しました。私の分離レベルは READ_COMMITED で、うまく機能しました。
public synchronized Schedule getSchedule(Date date) {
Schedule schedule = dao.getSchedule(date);
if (schedule == null) {
schedule = createSchedule(date);
dao.save(schedule);
HibernateUtils.getCurrentSession().getTransaction().commit();
HibernateUtils.getCurrentSession().getTransaction().begin();
}
return schedule;
}
現在、このプロジェクトで Spring を使用しており、トランザクション管理に aop を使用しています。手動取引コードを削除しました。複数のスレッドでテストしていますが、デッドロックが発生しました。トランザクションを再開してみてください
私の取引 AOP:
<tx:advice id="txAdvice">
<tx:attributes >
<tx:method name="getSchedule" isolation="SERIALIZABLE" />
<tx:method name="*" />
</tx:attributes>
</tx:advice>