java事务处理JavaEE 6
目前我正在研究JavaEE 6事务处理,我有点卡住了
我模拟了一个研讨会预订引擎,有人可以在其中预订一个或多个人参加研讨会。 我的实体如下所示:
@Entity
@XmlRootElement
public class Seminar {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
@Version
private Long version;
private Integer freeCapacity;
... //getters & setters
}
这是EJB:
@Stateless
public class SeminarBooking {
@PersistenceContext
EntityManager em;
@Inject
Event<Seminar> txListeners;
public boolean bookSeminar(Long seminarId, int numberOfPersons) {
Seminar seminar = em.find(Seminar.class, seminarId);
Integer freeCapacity = seminar.getFreeCapacity();
if((freeCapacity - numberOfPersons) >= 0) {
//setting free capacity after booking
seminar.setFreeCapacity(freeCapacity - numberOfPersons);
txListeners.fire(seminar);
return true;
}
return false;
}
}
我的事务侦听器如下所示:
public class TxListener {
public void onSuccess(@Observes(during=TransactionPhase.AFTER_SUCCESS) Seminar seminar) {
//omitted retrieving of minute,second,milli
logger.fine("Successful booking -- " + minute + ":" + second + ":" + milli + " FreeCapacity: "+seminar.getFreeCapacity());
}
}
问题是,我在后端并行处理100个线程,并得到如下日志条目:
Successful booking -- 24:50:51 FreeCapacity: 9641
Successful booking -- 24:50:61 FreeCapacity: 9641
Successful booking -- 24:50:54 FreeCapacity: 9641
Successful booking -- 24:50:637 FreeCapacity: 9639
怎么可能有成功(已提交)的交易具有相同的自由容量价值
在我看来,第二个和第三个事务应该抛出一个^{
我错过什么了吗?我怎样才能解决这个问题
共 (0) 个答案