2014-03-13 53 views
0

讓我首先提供我的應用程序的執行流程。驗證和數據庫更新:Java Servlet

在申請中,訂戶可以通過提供他們的信息和信用卡號碼進行註冊。根據提供的信息,應用程序返回成功/失敗響應。

在應用程序中檢查一個CC號碼只能用於固定的次數。應用程序檢查是否超出該計數。如果是,則返回失敗響應。

從技術上講,它是使用J2EE架構(servlet和JSP)設計的。現在,CC使用計數的檢查位置遠高於插入邏輯。因此,如果將CC限制配置爲1,並且具有相同CC號碼的2個登記請求同時進入,則兩個訂戶都登記,而理想情況下只有一個應該具有。

任何人都可以幫助我解決這個問題嗎?一種可能的解決方案是將兩者(檢查和插入)操作結合在一起並將它們包裝在靜態同步塊中。但是,在這種特殊情況下,這似乎並不合適,因爲它會干擾整個流程。任何其他想法?

回答

0

當你讀店多少次卡已被使用(我假設是在你的表中的列)

當你做了更新,限制更新只做如果更新表中的列與您之前存儲的值相同。

如果你更新了1行,那麼你就是贏家。

如果您的更新不更新1行,那麼該卡已被多次使用。

+0

是的。這確實是一張桌子上的專欄。考慮以下步驟:當前計數爲0,最大計數爲1 1.線程1進入,讀取計數(0)並將其存儲在某處。 2.線程2進入,讀取計數,它仍然爲0,因爲線程1尚未完成。 3.線程1完成插入,找到值和先前存儲的值相同(0),因此將其更新爲1. 4.線程2完成插入,發現值不同,因此, t存儲。 但是,在這種情況下,兩個線程都會通過,這不應該發生。 –

+0

不完全 - 在第二種情況下 - 當它沒有存儲時 - 您認識到插入未起作用,並將其作爲錯誤報告給用戶。這並不能真正完全解決你的問題,因爲如果最大計數是2,你可能會希望這兩個線程都能工作......也許可以將更新語句更改爲只在表中的列小於最大計數時執行更新。我認爲這會更適合你 - 你甚至不需要首先閱讀(除非你的代碼的其他部分依賴於這些數據) – DaveH