2013-02-22 60 views
5

我很好奇PHP腳本和MySQL的行爲? 該腳本基本上是兩個SQL查詢。PHP腳本在多次同時訪問MySQL數據庫時會發生什麼?

第一個SELECT並從某個id決定的特定行的列中獲取一個數字。

然後,如果數字是正數,則第二次通過減去一定數量更新列。

很顯然,這是一個經典的案例,我會使用事務或鎖或互斥或什麼。

我的問題是這樣的: 在一個網站它是兩個或兩個以上的用戶完全可以調用腳本在同一時間同一行。如果你不使用事務或鎖表,PHP將如何處理這個問題?它們是兩個查詢/函數調用,但它們在一個腳本中。它是否等待整個腳本返回給它的相應用戶再次爲另一個用戶運行它,或者因爲它們是不同的查詢,因爲它可能運行第一個查詢在多個用戶調用相同的腳本,然後第二個查詢另一個集。

基本上我問,因爲我正在做一些事情,我沒有足夠的權限來使用事務或鎖,我想知道我是否可以避免一個互斥體(我不知道這個詞,基本上是一個新的調用者表;在調用上面的腳本之前,我將調用一個新的腳本,在此之前,我將把表的布爾列變爲true,以便寫入,以便其他人在原始腳本完成時不能進行,然後將bacl設置爲false,以便下一行可以做等)

編輯: 我不確定選擇更新是否包含在上面提到的權限。負責回答我的問題的人很難找到,我已經與我一起尋找他...

回答

1

很奇怪,你可以做更新,但不能鎖定表(更新鎖定表的一些引擎和鎖定其他行)。但是,如果你真的無法鎖定,你可以使用get_lock function。它像互斥體一樣工作。

P.S.如果您僅使用更新(set a=10),則可能會丟失一些數據。如果您在該字段使用轉讓(set a=10+a),這絕不會發生。

+0

是的,剛剛得到了一個響應,我可以鎖表...所以你是對的。至於P.S,實際上是我在做什麼;在列上使用引用(free = free - {$ diff}) – 2013-02-22 13:30:00

+0

所以現在我知道我可以使用SELECT ... FOR UPDATE。你知道這是如何工作的。我理解它的方式是鎖定select(select)和write(update)兩個結果行(來自select查詢),但我不確定它何時釋放它們......在這些行上進行下一次更新後? – 2013-02-22 13:32:23

+1

SELECT ... FOR UPDATE只在交易中工作。它將鎖定行直到事務結束。 – sectus 2013-02-22 14:01:54

0

難道你不能在一次通話中這樣做,這樣不會有太大影響嗎?

UPDATE T1 
    SET T1.COLUMN = T2.COLUMN - 4 
    FROM TABLE1 AS T1 
    INNER JOIN TABLE2 AS T2 
     ON T1.COLUMN = T2.COLUMN 
    WHERE T2.COLUMN = ID 
    AND T2.COLUMN > 0 
+0

好吧,我真的過於簡單化了這個過程,因爲對於核心問題你不需要知道腳本的細節。我只想說我已經想到了,這將是一個非常龐大而複雜的查詢。儘管如此,感謝雖然:) – 2013-02-22 13:28:39

相關問題