2013-03-26 157 views
0

我開發了一個網上售票系統,在我工作的地方,並已經進入了一個陌生的麻煩。避免重複輸入MySQL和PHP

所有引發的票據都存儲在一個mysql表中。打開的票據由「分配的」列標識,其中「假」是未分配的票證的默認值。然後,工程師點擊網頁上的按鈕'Get Ticket',並根據優先級將工單分配給工程師。

該工具非常完美,但是,自過去2-3天以來,當票據流量增加時,出現了2個或3個工程師一起按下「獲取票務」按鈕,並且所有這些按鈕都分配了相同的票證。

任何人都可以幫助我什麼是避免此類錯誤的最佳方法。

我甚至試圖鎖定數據庫,但沒有奏效。我正在尋找MySQL交易,但我認爲這可能會減慢應用程序。

請幫助任何建議!

+1

請顯示錶格的結構和表格之間的關係(也請注意應用程序執行的邏輯關係)。 – 2013-03-26 11:01:44

回答

1

你需要使用事務。 交易在數據庫環境提供訪問數據庫的併發程序之間的隔離。如果沒有提供隔離,程序的結果可能是錯誤的。

1

如果你的數據庫結構包含

  • 取票
  • 的 「分配」 標誌
  • 的唯一標識符
  • 「用戶名」的「assigned_to」列
  • 票創建時間戳和/或票更新時間戳

您可以用atomical更新和更新的限制條款解決這個問題:

UPDATE tickets 
    SET 
     assigned = TRUE, 
     updated_at = NOW(), 
     assigned_to = @current_user_id 
    WHERE assigned = FALSE 
    LIMIT 1; 

然後你就可以「收穫」開放已使用選擇已分配給當前用戶ID的票證:

SELECT * 
    FROM tickets 
    WHERE assigned_to = @current_user_id 
    ORDER BY updated_at DESC 
    LIMIT 1; 

這利用了任何更新子句的原子性質。由於您的更新工作沒有必要分解爲多個語句,因此您不需要事務處理。

如果更新更復雜,需要您從各個地方選擇數據,然後將其組成一個更新,那麼當然需要事務。

+0

感謝米哈伊·斯坦庫,這正是我所做的一切,但有大約50個用戶登錄。唯一的變化是更新語句之後,有一個INSERT語句到被使用後有另一個數據庫。因此,在選擇查詢被觸發之前,更新和插入查詢也會觸發另一個單擊該按鈕的用戶。任何建議如何限制這一點。 – Guns 2013-03-26 11:25:09

+0

如何獲取insert語句的數據?通過選擇?您在更新之前還是之後選擇數據? – 2013-03-26 11:44:21