0

入力に基づいて永続化された 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>
4

1 に答える 1