情况是这样的,
成员必须兑换令牌才能访问(解锁)给定物品。相关的数据库表包括:
表 1
Table MEMBER_BALANCE: MEMBER_ID, TOKEN_BALANCE
表 2
Table UNLOCKED_ITEM: MEMBER_ID, DATE_UNLOCKED, ITEM_ID
我需要强制执行的检查或约束是
当用户尝试解锁项目时,TOKEN_BALANCE必须> 0,并且
用户之前未解锁过同一项目。
我的直觉倾向是在会员服务中编写一个简单的方法.java:
@Transactional
public void unlockItem(Member member, Item item){
memberBalanceDAO.decrementBalance(member);
itemDAO.unlockItem(member, item);
}
我已经通过在表上添加/对的约束来处理第二个要求。uniqueMEMBER_IDITEM_IDUNLOCKED_ITEM
我认为,我唯一需要注意的是,用户试图同时解锁许多物品,但未满足要求。例如, 是 1,但用户单击以虚拟方式同时解锁两个项目。TOKEN_BALANCETOKEN_BALANCE
以下是我的方法:MemberBalanceDAO.decrementBalance
@Transactional
public void decrementBalance(Member member) {
MemberBalance memberBalance = this.findMemberBalance(member);
if (memberBalance.getTokens() >= 1) {
memberBalance.setTokens(memberBalance.getTokens() - 1);
this.save(memberBalance);
} else {
throw new SomeCustomRTException("No balance");
}
}
我不认为这可以保护我免受= 1用例的影响。我担心同时有多个解锁请求。如果余额为 1,我可以同时接到两个调用,两个调用都将余额提交到 0,但随后也收到两个成功的调用,对吧?TOKEN_BALANCEdecrementBalance()itemDAO.unlockItem(...)
我应该如何实现这一点?是否应将服务级别方法的事务设置为 ?还是有更清洁/更好的方法来解决这个问题?isolation = Isolation.SERIALIZABLE
江户川乱折腾
慕工程0101907
随时随地看视频慕课网APP
相关分类