有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案