Jboss5で実行されている Web アプリケーションにDAO レイヤー(Sybase DB)を実装するために Hibernate を使用しています。
私が直面している問題は、クライアント/UI が複数の同時 HTTP 呼び出しを行うときです。これにより、DAO 挿入メソッドが呼び出されます。競合状態が発生し、両方の呼び出しで DAO 挿入メソッドがほぼ同時に実行されます。私が実際に欲しいのは
- 最初のリクエストは DAO メソッドを呼び出します
- 最初のリクエストは現在のデータベース値を読み取ります
- 現在のデータベース値に基づいて新しいデータが有効かどうかを確認します
- 有効な場合は、新しい値を挿入します
- そして、現在の db 値を読み取るための 2 番目の要求
- 新しいデータが有効かどうかを確認する
- 有効な場合は、値を挿入します...さらに呼び出しがある場合など
私のDAOレイヤーコードは次のようになります:
@Override
@Transactional
public Set<PartyData> insertPartyData(final Set<PartyData> pData) throws DataServiceException
{
sessionFactory.getCurrentSession().getTransaction().begin();
//code to read the current db value
//validation code to check if new value can be inserted based on what's currently in db
sessionFactory.getCurrentSession().save(pData);
sessionFactory.getCurrentSession().getTransaction().commit();
}
質問?
前のトランザクションが完了するまで他の要求が待機するように、db が 1 つのトランザクションの間テーブルをロックすることを確認するにはどうすればよいですか?