2011-10-19 55 views
3

我正在php中製作一個網站,其中我想銷售一些收費號碼。對於每個請求,我要做這些原子操作:在所有請求之間的php中的關鍵部分

  • 問數據庫可用電量數
  • 標誌着充數作爲出售
  • 增加數(文件或數據庫),這顯示客戶的數量得到了一個電話號碼

我知道如何做這些操作,如果它可以幫助,我使用的是mysql。但我的問題是如何做到這些操作之間的所有請求原子?我的意思是我如何強制Web服務器(apache)和php解釋器對所有請求逐一運行這部分,而不是以並行方式運行?

P.s:請將您的答案作爲php的解決方案,而不是與數據庫相關的解決方案。

+2

它不是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

+0

並且沒有辦法讓它在PHP中? – Saeed

回答

5

所有這些操作都是數據庫相關的。所以你並不需要在關鍵部分使PHP運行代碼;在數據庫中序列化這些操作就足夠了。

最簡單的方法是在執行這些操作時對LOCK TABLES ... WRITE;這保證只有一個腳本會一次與數據庫交談。

另一種方法是SET TRANSACTION ISOLATION LEVEL SERIALIZABLE,並在關閉自動提交的事務中運行所有操作(即使您決定使用表鎖,您也應該使用事務來確保數據完整性)。

更新:如果你絕對必須這樣做在PHP中,那麼你可以達到使用flock的目標:以獨佔模式

$fp = fopen('sunc_file', 'r+'); 
if (flock($fp, LOCK_EX)) { 
    // Perform database ops here 
    flock($fp, LOCK_UN); // release the lock 
} 
else { 
    die("Couldn't get the lock!"); 
} 
fclose($fp); 

flock將防止鎖定保護文件的任何其他過程,從而讓您的腳本嚴格執行序列化,,但請閱讀手冊頁上的巨型紅色警告!

+0

好的一個,也使它在交易中的作用... –

+0

你的答案是有幫助的(+1),但你知道任何PHP解決方案? – Saeed

+0

另請參見:[MySQL表鎖定後PHP崩潰](http://stackoverflow.com/questions/5167820/mysql-table-locked-after-php-crashes) – hakre

5

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,例如,如果關鍵區域不會期間由於某種原因崩潰的應用程序阻止所有進一步的請求)

乾杯

相關問題