JPA を使用して JBOSS のエンティティを処理しています。1 つのエンティティがさまざまなトランザクションの複数のスレッドによって更新されます。エンティティに @Version 属性が追加されており、エンティティを更新する前に OptimisticLock を取得しています。例外を処理できず、トランザクションの場合は再試行できません失敗します。
エンティティは
@Entity
public class DataEntity
{
@Id
int id;
long count;
@Version
int versionAttribute;
....
....
エンティティを更新するコードは
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public void updateEntity()
{
DataEntity d=entityManager.find(DataEntity.class,0,LockModeType.OPTIMISTIC);
d.setCount(d.getCount()+1);
}
ご覧のとおり、メソッド updateEntity() は TransactionAttributeType.REQUIRES_NEW を使用して新しいトランザクションを作成します。ここでは、トランザクションはコンテナーで管理されています。OptimisticLockingException がスローされたときに再試行するのを手伝ってください。
例外を処理する場所は? /リトライロジックはどこに書く?