Блокировка таблицы

Opik

Новичок
Блокировка таблицы

Есть примерно такой код:
PHP:
$query = mysql_query("SELECT * FROM table WHERE ...");
if(mysql_num_rows($query))
{
/// some code

}
else
{
 mysql_query("LOCK TABLES table WRITE");
 
 mysql_query("INSERT INTO `table` VALUES (....)");

 mysql_query("UNLOCK TABLES");
}
Т.е если 2 юзера одновременно запросят скрипт. поток должен блокироваться. и не должно срабатывать INSERT от сразу 2-ух юзеров.
но почему то срабатывает даже с блокировкой. или я неправильно блокирую?
 

voituk

прозревший
Нифига не понял.
Обьясни чего ты хочешь добиться?
 

Opik

Новичок
Сделать, что бы пока выполняется:
mysql_query("INSERT INTO `table` VALUES (....)");

запрос
$query = mysql_query("SELECT * FROM table WHERE ...");

ждал свежих данных.
Что бы не вышло такого:
1) 2 юзара запросили скрипт
2) У обоих НЕ прошла проверка
if(mysql_num_rows($query))
3) Оба юзера добавили
mysql_query("INSERT INTO `table` VALUES (....)");

Т.к скрипт "многопользовательский". и данные между юзерами пересекаются.
 

Popoff

popoff.donetsk.ua
Сделать, что бы пока выполняется:
mysql_query("INSERT INTO `table` VALUES (....)");

запрос
$query = mysql_query("SELECT * FROM table WHERE ...");

ждал свежих данных.
Для этого блокировать нужно до выборки.
 

Opik

Новичок
спасибо

-~{}~ 25.01.06 19:26:

как я понял блокировать нужно до селектов, а разблокировать после инсертов?
т.е получается:
PHP:
 mysql_query("LOCK TABLES table WRITE"); 
$query = mysql_query("SELECT * FROM table WHERE условие1"); 
$result = mysql_fetch_array($query);
if(!$result)
{
$query = mysql_query("SELECT * FROM table WHERE условие2"); 
if(mysql_num_rows($query)) 
{ 
/// some code 
// но тут то проблемы. т.е тут делаются запросы из других таблиц. и их нужно тоже лочить. что неприемлимо
} 
else 
{  
 mysql_query("INSERT INTO `table` VALUES (....)"); 
}
}
 mysql_query("UNLOCK TABLES");
Лог нужен когда второе условие возращает 0 рядов. Можно ли как нибудь сделать, что бы только в этом случае шла блокировка.
Придется переделать видимо как то логику. как пока не вижу. думаю.
есть идеи?

-~{}~ 25.01.06 19:28:

Хотя можно попробовать так:
PHP:
mysql_query("LOCK TABLES table WRITE");  
$query = mysql_query("SELECT * FROM table WHERE условие1");  
$result = mysql_fetch_array($query); 
if(!$result) 
{ 
$query = mysql_query("SELECT * FROM table WHERE условие2");  
if(mysql_num_rows($query))  
{  
 mysql_query("UNLOCK TABLES");
/// some code  
// но тут то проблемы. т.е тут делаются запросы из других таблиц. и их нужно тоже лочить. что неприемлимо 
}  
else  
{   
 mysql_query("INSERT INTO `table` VALUES (....)");  
 mysql_query("UNLOCK TABLES");
} 
}
-~{}~ 26.01.06 16:09:

подскажите пож-та правильный ли последний вариант?
 

Popoff

popoff.donetsk.ua
в последнем варианте ты не разблокируешь таблицу, если условие1 ложно :) разблокировка должна стоять после всех условий :)

-~{}~ 26.01.06 18:15:

тьфу, если первый запрос вернет хотя бы одну строку :)
 

Opik

Новичок
Да, я заметил. уже.
и сделал так:
PHP:
$query = mysql_query("SELECT * FROM table WHERE условие1");   
$result = mysql_fetch_array($query);  
if(!$result)  
{  
mysql_query("LOCK TABLES table WRITE");   
$query = mysql_query("SELECT * FROM table WHERE условие2");   
if(mysql_num_rows($query))   
{   
 mysql_query("UNLOCK TABLES"); 
/// some code   
// но тут то проблемы. т.е тут делаются запросы из других таблиц. и их нужно тоже лочить. что неприемлимо  
}   
else   
{    
 mysql_query("INSERT INTO `table` VALUES (....)");   
 mysql_query("UNLOCK TABLES"); 
}  
}
Т.к непосредственно критично второе условие. И ошибки срабатывают в нем. или же захватить всё равно 2 условия (что бы наверняка) и добавить после ещё разблокировку
 

EugeneVC

Новичок
блокировать надо все таблицы из которых делаются выборки!
иначе ничего не получится!
 
Сверху