亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

檢查和更新表中的記錄時出現的潛在并發問題

檢查和更新表中的記錄時出現的潛在并發問題

江戶川亂折騰 2022-09-28 15:40:47
情況是這樣的,成員必須兌換令牌才能訪問(解鎖)給定物品。相關的數據庫表包括:表 1Table MEMBER_BALANCE: MEMBER_ID, TOKEN_BALANCE表 2Table UNLOCKED_ITEM: MEMBER_ID, DATE_UNLOCKED, ITEM_ID我需要強制執行的檢查或約束是當用戶嘗試解鎖項目時,TOKEN_BALANCE必須> 0,并且用戶之前未解鎖過同一項目。我的直覺傾向是在會員服務中編寫一個簡單的方法.java:@Transactionalpublic void unlockItem(Member member, Item item){    memberBalanceDAO.decrementBalance(member);    itemDAO.unlockItem(member, item);}我已經通過在表上添加/對的約束來處理第二個要求。uniqueMEMBER_IDITEM_IDUNLOCKED_ITEM我認為,我唯一需要注意的是,用戶試圖同時解鎖許多物品,但未滿足要求。例如, 是 1,但用戶單擊以虛擬方式同時解鎖兩個項目。TOKEN_BALANCETOKEN_BALANCE以下是我的方法:MemberBalanceDAO.decrementBalance@Transactionalpublic 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
查看完整描述

1 回答

?
慕工程0101907

TA貢獻1887條經驗 獲得超5個贊

我寧愿建議您在表中引入列。請參閱文檔“樂觀鎖定”versionmember_balance

正如你所提到的,你不能修改架構;你可以去無版本樂觀鎖,在這里解釋。

或者你可能想去悲觀的鎖定,在這里解釋。然后,您可以修改您的方法,在那里獲取成員余額,不要使用 。例如decrementBalance()findMemberBalance()

@Transactional

public void decrementBalance(Member member) {

    MemberBalance memberBalance = entityManager.find(

        MemberBalance.class, member.id, LockModeType.PESSIMISTIC_WRITE,             

        Collections.singletonMap( "javax.persistence.lock.timeout", 200 ) //If not supported, the Hibernate dialect ignores this query hint.

    );

    if (memberBalance.getTokens() >= 1) {

        memberBalance.setTokens(memberBalance.getTokens() - 1);

        this.save(memberBalance);

    } else {

        throw new SomeCustomRTException("No balance");

    }

}

鈮:它可能無法正常工作;它只是為了給你一些提示。


查看完整回答
反對 回復 2022-09-28
  • 1 回答
  • 0 關注
  • 105 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號