2015-02-10 30 views
2

我正在尋求關於如何解決使用PHP和mySQL構建的Web應用程序中的併發訪問問題的建議。PHP + mySQL和併發數據庫訪問問題

應用程序用戶定製我稱之爲「集合」的東西。定製完成後,他們可以點擊貝寶「立即購買」按鈕併購買收藏。

一個集合由兩個不同的事物組成:一組小部件和一組小部件。 「自定義」涉及選擇要包含在窗口小部件組中的哪些窗口小部件,以及要包含在小工具組中的哪些小工具。

這是一種簡化的僞實體關係圖的:

ERD

寬範圍的小窗口和小工具是可用的,從中選擇,但每個插件和每個小工具是唯一的,只能是一次使用一組。

問題出在購買集合。我需要確保當用戶點擊「立即購買」按鈕時,他們爲其小工具組選擇的小工具以及他們爲小工具組選擇的小工具尚未在其他付費收藏中使用。

想象兩個人同時使用該系統。每個都創建一個集合*,其中包含一些相同的小部件和/或小工具,然後進入結帳頁面,他們都在同一時刻點擊「立即購買」按鈕。運行標準查詢以測試選定的小部件/小配件是否已被使用在這種情況下是不可靠的,因爲對於兩個用戶而言,系統將回答「這些是可用的」,並且每個用戶都可以用「預訂資源「(原樣)。

所以我今天一直在做很多關於交易和鎖定的閱讀。我認爲這將會涉及到我的解決方案,但是我很難想象這可能會如何工作。

目前我所能想象的是這樣的:當點擊Buy Now按鈕時,我開始一個事務,然後運行一個查詢來鎖定(以防止其他會話讀取)窗口小部件表中的所有行以及集合中列出的每個項目的小工具表中的所有行。隨着事務開始並鎖定到位,我可以運行查詢來測試是否有任何選定的項目已被使用。 如果查詢顯示物品未被使用,我會允許購買繼續,一旦完成,我會釋放鎖。

如果查詢表明項目已被使用,我會返回一個錯誤並釋放鎖定。

如果另一個用戶試圖同時購買包含一些相同小部件/小工具的集合,他們要麼收到鎖超時,並且返回一個錯誤;或者他們必須等到其他會話已經刪除它的鎖,然後 - 當他們的會話應用相同的鎖並運行相同的查詢時 - 他們會看到「正在使用」錯誤。

所以我有兩個問題。這聽起來像是處理我的情況的最佳方式。第二,如果確實如此,它是否可以按照我所描述的方式進行操作?

非常感謝你提前

*可能被保存供以後使用。我允許用戶創建包含他們喜歡的任何窗口小部件/小工具的集合 - 即使是那些已經在使用的窗口小部件/小工具 - 推理如果他們現在推遲購買,那麼當他們稍後繼續購買時,這些資源可能再次可用

回答

1

是的,是的。是的,這是最好的方法,因爲它是最明顯和最常用的方法。是的,這種方法是有效的,我自己使用它,並且處理由使用它的其他人編寫的代碼。

儘量不要在開啓交易的同時做分析;預先測試,啓動事務,設置樂觀鎖,結束事務,檢查哪些成功,以及如果某些已經被鎖定,則釋放剛剛設置的鎖。你的數據庫會感謝你。

+0

聽到這很讓人放心,謝謝安德拉斯。我將盡一切努力將其作爲我的解決方案並回報。對於其他答案,我會將「未回答」問題留出幾天時間。 – AMarch 2015-02-10 19:26:14