EJB 3.0을 사용하면 두 개의 스레드가이 코드를 실행하려고 시도합니다 (즉, 상태 비 저장 세션빈 내부). 두 스레드는 if 문을 통과하여 문을 인쇄 할 수 있습니다. 내가 성공하지 직렬화에 트랜잭션 격리 수준을 설정하려고했습니다EJB 3.0 트랜잭션 및 동기화
userTransaction.begin(); //userTransaction is of class UserTransaction
myEntity = entityManager.find(MyEntity.class, id); //entityManager is of class EntityManager
if (myEntity.getStatus() != "DONE") {
myEntity.setStatus("DONE");
entityManager.merge(myEntity);
System.out.println("Only one thread should be running this");
}
userTransaction.commit();
:
org.hibernate.Session session = (org.hibernate.Session) entityManager.getDelegate();
session.connection().setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);
어쩌면 내가 잘못된 접근 방식을 사용하고 있습니다
.UPDATE
제이 보스 5를 지원 does't 때문에 싱글 세션 빈을 사용할 수 없습니다. 지금은 내가 교착 상태에 재차 실행 문제를 다음 코드를 시도하고있다 :
connection.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);
connection.setAutoCommit(false);
//selectStatement and updateStatement are of type PreparedStatement
selectStatement = connection.prepareStatement("SELECT STATUS FROM MYTABLE WHERE STATUS != 'DONE' AND ID=?");
selectStatement.setInt(1, id);
updateStatement = connection.prepareStatement("UPDATE MYTABLE SET STATUS = 'DONE' WHERE ID=?");
updateStatement.setInt(1, id);
resultSet = selectStatement.executeQuery();
if (resultSet.next()) {
updateStatement.executeUpdate();
}
connection.commit();
유감스럽게도 Jboss 5에서 Singleton Bean을 사용할 수 없습니다. – otonakav
@otonakav EJB 3.1을 사용하고 있습니다. EJB 3.1을 사용하고 있는데 특별한 이유가 없습니다. –
Jboss 5가 EJB 3.0을 사용하고 있다고 생각합니다. 질문을 편집했습니다. 그러나 이것이 EJB 3.1에 들어갈 수있는 방법이기 때문에 감사합니다. – otonakav