2011-05-25 24 views
1

我的應用程序由一對Apache服務器與一個普通的MySQL框交談組成。部分應用程序允許用戶在將來創建一個小時約會。我需要一種防止不同用戶同時來自不同Apache實例的機制,預訂相同的一小時預約時隙。我已經看到在Oracle數據庫上實現的一個類似的「系統間互斥」解決方案(基本上是'select ... for update'),但沒有處理與MySQL相同的細節。將不勝感激任何建議,代碼或文檔參考,最佳實踐等。嘗試谷歌周圍,但主要是討論關於MySQL內部互斥體出現。通過MySQL的應用程序互斥InnoDB行鎖

這些都是我的MySQL設置我想相關的(我的代碼將有try-catch代碼以及所有和不應該保釋無需解鎖它鎖定,但必須考慮到在這種情況下會發生什麼,以及):

mysql> show variables like 'innodb_rollback_on_timeout'; 
+----------------------------+-------+ 
| Variable_name    | Value | 
+----------------------------+-------+ 
| innodb_rollback_on_timeout | OFF | 
+----------------------------+-------+ 
1 row in set (0.00 sec) 

mysql> show variables like 'innodb_lock_wait_timeout'; 
+--------------------------+-------+ 
| Variable_name   | Value | 
+--------------------------+-------+ 
| innodb_lock_wait_timeout | 100 | 
+--------------------------+-------+ 
1 row in set (0.00 sec) 

mysql> select @@autocommit; 
+--------------+ 
| @@autocommit | 
+--------------+ 
|   1 | 
+--------------+ 
1 row in set (0.00 sec) 

你可以推薦任何替代解決方案(在MySQL之外)?我確實有一個memcached實例也在運行,但經常被刷新(並且不確定我想要memcachedb等來實現容錯)。

感謝您的幫助......

回答

1

這裏回答我的問題。這種變化是我們最終最終做的(以PHP爲例):

<?php 
$conn = mysql_connect('localhost', 'name', 'pass'); 
if (!$conn) { 
    echo "Unable to connect to DB: " . mysql_error(); 
    exit; 
} 
if (!mysql_select_db("my_db")) { 
    echo "Unable to select mydbname: " . mysql_error(); 
    exit; 
} 
mysql_query('SET AUTOCOMMIT=0'); //very important! this makes FOR UPDATE work                       
mysql_query('START TRANSACTION'); 
$sql = "SELECT * from my_mutex_table where entity_id = 'my_mutex_key' FOR UPDATE"; 
$result = mysql_query($sql); 
if (!$result) { 
    echo "Could not successfully run query ($sql) from DB: " . mysql_error(); 
    exit; 
} 
if (mysql_num_rows($result) == 0) { 
    echo "No rows found, nothing to print so am exiting"; 
    exit; 
} 

echo 'Locked. Hit Enter to unlock...'; 
$response = trim(fgets(STDIN)); 
mysql_free_result($result); 
echo "Unlocked\n"; 
?> 

驗證它從兩個不同的控制檯運行。時間性能比基於標準文件鎖的互斥體差一些,但仍然非常可以接受。

+0

這是我正在尋找,我不是運氣。謝謝。 – dlopezgonzalez 2013-07-08 14:02:46