Theres使用面向php的解決方案是一個缺點,它是你只能在一臺機器上保證這一點。您當然可以將其鎖定在關鍵區域的單個進程中,但只能在單臺機器上進行。如果你有2個前端apache/php服務器和一個後端mysql服務器,這個解決方案將會失敗。一個MySQL交易是更好的解決方案..
然而,想象只有一臺機器運行這個代碼,它可能與解決方案喬恩張貼(使用文件作爲鎖),或者如果你在一個linux/unix服務器也可以使用IPC方法,並創建長度爲1(互斥體)的系統V信號量。
# in your scripts setup/init phase:
define('MUTEX_KEY', 123456); # the key to access you unique semaphore
sem_get(MUTEX_KEY, 1, 0666, 1);
# later on, you reach the critical section:
# sem_acquire will block until the mutex has become availible
sem_acquire(($resource = sem_get(MUTEX_KEY)));
# queries here ...
sem_release($resource);
# now that sem_release has been called, the next processes that was blocked
# on the sem_acquire call may enter the critical region
雖然基於文件的解決方案更便於攜帶(適用於Windows服務器)互斥/爲sem_ *解決方案是更快,更安全(在auto_release,例如,如果關鍵區域不會期間由於某種原因崩潰的應用程序阻止所有進一步的請求)
乾杯
它不是apache/php相關的,它是關於mysql原子事務,觀察mysql的innodb引擎和事務[here](http://www.databasejournal.com/features/mysql/article.php/3382171/Transactions-in -MySQL.htm)或[這裏](http://dev.mysql.com/doc/refman/5.1/en/innodb-transaction-model.html) – user973254
並且沒有辦法讓它在PHP中? – Saeed