рассмотрите следующие пункты 1) вы хотите, чтобы несколько администраторов редактировали разные продукты 2) вы не хотите, чтобы несколько администраторов редактировали один и тот же продукт
3) в вашем коде и сохраняете продукт в виде одной таблицы.На реальном сайте электронной коммерции информация о продукте разделена на несколько таблиц
, чтобы достичь этого, вам нужно установить блокировки для mysql всего приложения
mysql> select get_lock('product_id_12345', 5);
+---------------------------------+
| get_lock('product_id_12345', 5) |
+---------------------------------+
| 1 |
+---------------------------------+
1 row in set (0.00 sec)
. Код выше устанавливает блокировку с помощью product_id,если какое-либо другое соединение пытается получить блокировку, используя тот же product_id, вы получите 0 в качестве ответа - это означает, что какой-то другой пользователь обновляет этот же product_id
mysql>
mysql> select IS_FREE_LOCK('product_id_12345');
+----------------------------------+
| IS_FREE_LOCK('product_id_12345') |
+----------------------------------+
| 0 |
+----------------------------------+
1 row in set (0.00 sec)
mysql>
mysql> select IS_USED_LOCK('product_id_12345');
+----------------------------------+
| IS_USED_LOCK('product_id_12345') |
+----------------------------------+
| 46 |
+----------------------------------+
1 row in set (0.00 sec)
mysql>
mysql> select connection_id();
+-----------------+
| connection_id() |
+-----------------+
| 46 |
+-----------------+
1 row in set (0.00 sec)
SAMPLE ALGORITHM
<?php
ini_set('display_errors', 1);
function updateProduct() {
$user = 'root';
$pass = 'xxx';
$DB = 'test';
$host = 'localhost';
try
{
$conn = new mysqli($host, $user, $pass, $DB);
$data['productId'] = 'product_id_12345';
$data['productName'] = 'test';
$data['productDesc'] = 'testing';
$isLockFree = 'select IS_USED_LOCK("'.$data['productId'].'") ';
$isLockFreeResult = mysqli_query($conn, $isLockFree);
$row=mysqli_fetch_row($isLockFreeResult);
if(empty($row[0]))
{
$lock = 'select get_lock("'.$data['productId'].'")';
$result = mysqli_query($conn, $lock);
echo 'lock established';
$query = "UPDATE products
SET product_name='".$data['productName']."',
product_desc='".$data['productDesc']."',
price=".$data['price']."
WHERE
product_id=".$data['productId'];
$result = mysqli_query($conn, $query);
if ($result == false)
{
throw new Exception('Failed to execute: '. $query . 'Error: '. mysqli_error($conn));
}
}
else
{
echo 'sorry! could not lock. somebody is updating the product info';
}
}
finally
{
mysqli_close($conn);
}
}
updateProduct();
?>