Как заблокировать таблицы mysql в php

Как заблокировать таблицы 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"); } 

Таким образом вы будете устанавливать блокировку каждый раз, когда вы вставляете строку!