Java 使用Play framework 1处理乐观锁定
我的头脑不太清醒。我使用的框架是Play1.2.5 比如说我在卖音乐会门票。我目前有以下情况:Java 使用Play framework 1处理乐观锁定,java,jpa,playframework,version,optimistic-locking,Java,Jpa,Playframework,Version,Optimistic Locking,我的头脑不太清醒。我使用的框架是Play1.2.5 比如说我在卖音乐会门票。我目前有以下情况: if (concert.ticketsSold < concert.tickets) { concert.ticketsSold ++; concert.save(); } 然而,当几个人同时预订时,TicketsSeld柜台的实际销售价值落后。当我卖出2700英镑时,我会说是2500英镑 这就是我开始阅读乐观锁例外的时候。在我在interweb上找到的所有示例中,人们倾向于捕
if (concert.ticketsSold < concert.tickets) {
concert.ticketsSold ++;
concert.save();
}
然而,当几个人同时预订时,TicketsSeld柜台的实际销售价值落后。当我卖出2700英镑时,我会说是2500英镑
这就是我开始阅读乐观锁例外的时候。在我在interweb上找到的所有示例中,人们倾向于捕捉OptimisticLockException,并向用户显示错误
我想要的是,系统在向用户显示错误之前重试一定次数。我写的代码如下:
boolean saved = false;
int tries = 0;
while (!saved) {
try {
if (concert.ticketsSold < concert.tickets) {
concert.ticketsSold ++;
concert.save();
saved = true;
} else break;
} catch (OptimisticLockException e) {
// reload concert object from the database
concert.refresh();
}
if (tries > 9) break;
tries++;
}
如上所述,我尝试从数据库中重新加载对象,以获得更新的对象,并获得正确数量的已售出票证,但无论我尝试刷新、重新加载、提交和开始新事务,对象都不会刷新,并且我仍然获得对象的正常缓存版本
你知道我做错了什么吗
非常感谢
阿克塞尔
PS:我没有使用任何缓存系统,比如memchached或其他。这些东西很难测试。你能证明票的数量应该改变,票的价值应该是多少吗?concert.refresh上应该执行什么代码?是的,我的测试方法是在从数据库获取模型后设置断点,然后在数据库中更改版本号和TicketsSeld计数器。。当代码运行时,新更新的对象永远不会被获取..Ha和refresh是JPA EntityManager中的一个标准方法:看起来这可能会有所帮助,如果是这样的话,将更新这个问题