Как заблокировать таблицы mysql в php? У меня есть этот код:
$db->query("LOCK TABLES tbl_othercharge WRITE"); for($x=0;$x<=500; $x++){ $id = get_max(); $db->query("INSERT INTO tbl_othercharge SET tblocID = '$id', assessmentID='lock1'"); } $db->query("UNLOCK TABLES");
Вот функция get_max (), которая, очевидно, не удастся, если выполняемый скрипт выполняется одновременно.
<?php function get_max(){ global $db; $max = $db->get_var("SELECT MAX(tblocNumber) FROM tbl_othercharge"); if($max == null){ $max = 1; }else if($max >= 1){ $max = $max + 1; } return 'OC'.$max; } ?>
Я пытаюсь проверить, есть ли проблемы параллелизма, выполнив один и тот же скрипт в двух браузерах. В приведенном выше скрипте добавлено 400+ записей вместо 999 записей. Как правильно заблокировать таблицу, пока я что-то в нее вставляю.
Я хочу заблокировать стол, чтобы это не произошло:
Поскольку вы можете видеть поле с префиксом «OC», оно должно иметь число, равное первичному ключу автоматического увеличения.
Единственное надежное решение – сделать вставку с фиктивным значением, получить последний идентификатор вставки и обновить строку до правильного значения.
mysql_query("INSERT INTO table (field) VALUES (dummy);"); $id = mysql_last_insert_id(); mysql_query("UPDATE table SET field='OC{$id}' WHERE id={$id} LIMIT 1;");
Я бы предложил отказаться от поля «OC» из таблицы, например
CREATE TABLE tbl_othercharge (tblocID int AUTO_INCREMENT PRIMARY KEY, assessmentID varchar(100)); CREATE VIEW vw_othercharge SELECT tblocID, concat('OC',tblocID) as OCnumber, assessmentID FROM tbl_othercharge
теперь направьте все соответствующие SELECT на vw_othercharge и забудьте об этом.
Попробуйте:
for($x=0;$x<=500; $x++){ $db->query("LOCK TABLES tbl_othercharge WRITE"); $id = get_max(); $db->query("INSERT INTO tbl_othercharge SET tblocID = '$id', assessmentID='lock1'"); $db->query("UNLOCK TABLES"); }
Таким образом вы будете устанавливать блокировку каждый раз, когда вы вставляете строку!