Сначала попробуйте эксперимент ниже, а затем попробуйте отобразить в соответствии с вашими требованиями.
Создать таблицу:
CREATE TABLE `t1` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`notid` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Затем создать:
создать rowlocking.php
<?php
require_once('connectvars.php');
// Connect to the database
$dbc = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);
$query = "START TRANSACTION";
$data = mysqli_query($dbc, $query);
$query = "SELECT * FROM t1 WHERE id=5 FOR UPDATE";
$data = mysqli_query($dbc, $query);
if (mysqli_num_rows($data) != 0) {
$row = mysqli_fetch_array($data);
echo $row['id'];
echo $row['notid'];
}
//$query = "COMMIT";
//$data = mysqli_query($dbc, $query);
sleep(10);
echo "After 10 seconds";
?>
Вышеуказанный скрипт получит доступ к строке с id = 5 и заблокирует для другой транзакции до времени ожидания 10 секунд.
create rowlocking1.php
<?php
require_once('connectvars.php');
// Connect to the database
$dbc = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);
$query = "START TRANSACTION";
$data = mysqli_query($dbc, $query);
$query = "SELECT * FROM t1 WHERE id=5 FOR UPDATE";
$data = mysqli_query($dbc, $query);
if (mysqli_num_rows($data) != 0) {
$row = mysqli_fetch_array($data);
echo $row['id'];
echo $row['notid'];
}
//sleep(10);
//$query = "COMMIT";
//$data = mysqli_query($dbc, $query);
//echo "After 10 seconds";
?>
Попытки вышеуказанного сценариячтобы получить доступ к той же строке с id = 5.
Теперь, если блокировка строк вашего сценария запуска и в течение этого 10-секундного времени ожидания, если вы запустите rowlocking1, она не сможет получить доступ к строке id = 5 до ее освобождения путем блокировки строк.После 10 секундного ожидания в режиме блокировки строк можно будет получить доступ к id строки = 5.
Попробуйте сопоставить эту концепцию с вашим сценарием, вы получите блокировку на уровне строк innoDB.Оставьте комментарий, если вам нужно подробное объяснение.