Транзакции на нескольких соединениях, целостность данных не выполняется, пока выполняется одна транзакция

Я пытаюсь работать на основе транзакций PHP-MYSqli с кодом OOPS для небольшого приложения в следующем сценарии:

PHP 5.6.x для серверной и настольной версии PHP phpdesktop-хром-57,0-гс-PHP-7.1.3, Таким образом, приложение будет работать как на 5.6.x, так и на 7.x версиях PHP.

Несколько человек могут получить доступ к одному и тому же php-приложению одновременно. Это означает, что у каждого пользователя будет независимое соединение, доступное для доступа к приложению, потому что я включил соединение в верхней части каждой страницы с помощью включения файлов. Я хочу, чтобы, когда один пользователь нажимал кнопку отправки, все таблицы внутри конкретной транзакции блокировались в режиме чтения и записи, и ни одна из них не была доступна ни одному из пользователей в том же или любом другом соединении. Таким образом, я хочу 100% целостности данных.

Я написал следующие два файла:

p1.php

<?php
ini_set('max_execution_time', 500);
$mysqli = new mysqli("localhost", "root", "", "jag_db");

if ($mysqli->connect_errno) {
printf("Connect failed: %s\n", $mysqli->connect_error);
exit();
}
if(isset($_POST['submit']))
{
$mysqli->autocommit(FALSE);
//$mysqli->begin_transaction(MYSQLI_TRANS_START_READ_WRITE);
$i=0;
$val2="Kurukshetra";
for($i=100;$i<=50000;$i++)
{
$stmt=$mysqli->prepare("INSERT INTO transtest (roll,city) VALUES(?,?)");
$stmt->bind_param('ss', $i, $val2);
if(!$stmt->execute())
{
$mysqli->rollback();
exit;
}
}
$sql20=$mysqli->prepare("SELECT * FROM transtest");
$sql20->execute();
$result20=$sql20->get_result();
if($result20->num_rows>0)
{
while($rows20=$result20->fetch_object())
{
$sno=$rows20->sno;
$stmt=$mysqli->prepare("UPDATE transtest SET city=? WHERE sno=?");
if($sno%2==0)
$city="Ambala";
else
$city="Kaithal";
$stmt->bind_param('ss', $city, $sno);
if(!$stmt->execute())
{
$mysqli->rollback();
exit;
}
}
}
else
{
$mysqli->rollback();
exit;
}
$stmt->close();
$mysqli->commit();
$mysqli->autocommit(TRUE);
}
$mysqli->close();
?>
<form method="post">
<button type="submit" name="submit"/>GO</button>
</form>

p2.php

<?php
ini_set('max_execution_time', 500);
$mysqli = new mysqli("localhost", "root", "", "jag_db");

if ($mysqli->connect_errno) {
printf("Connect failed: %s\n", $mysqli->connect_error);
exit();
}
if(isset($_POST['submit']))
{
$mysqli->autocommit(FALSE);
//$mysqli->begin_transaction(MYSQLI_TRANS_START_READ_WRITE);
$i=5001;
$j="Chandigarh";
$stmt=$mysqli->prepare("INSERT INTO transtest (roll,city) VALUES(?,?)");
$stmt->bind_param('ss', $i, $j);
if(!$stmt->execute())
{
$mysqli->rollback();
exit;
}
$sql20=$mysqli->prepare("SELECT * FROM transtest");
$sql20->execute();
$result20=$sql20->get_result();
if($result20->num_rows>0)
{
while($rows20=$result20->fetch_object())
{
echo $rows20->sno . "    ----    " . $rows20->roll  . "    ----    " . $rows20->city . "<br>";
}
}
else
{
$mysqli->rollback();
exit;
}
$sql20->close();
$mysqli->commit();
$mysqli->autocommit(TRUE);
}
$mysqli->close();
?>
<form method="post">
<button type="submit" name="submit"/>GO</button>
</form>

Сначала я запускаю p1.php и сразу же начинаю нажимать кнопку перехода на p2.php еще на другой вкладке браузера.
Ниже приведены результаты p2.php, когда:

p1.php все еще выполняется

Изображение: p1.php все еще выполняется

когда p1.php завершил выполнение

Изображение: когда p1.php завершил выполнение

Приятно видеть, что в конце я получаю точные результаты, но плохо видеть, что даже когда одна транзакция выполняется, другой пользователь получает неправильный вывод. Второй пользователь не должен видеть что-либо во время выполнения p1.php.

Примечание: $ mysqli-> begin_transaction (MYSQLI_TRANS_START_READ_WRITE);
не работает в моей текущей версии PHP. Это говорит Предупреждение:
mysqli :: begin_transaction (): эта версия сервера не поддерживает READ
НАПИСАТЬ »и« ТОЛЬКО ЧИТАТЬ ». Требуется минимум 5.6.5

Как решить эту проблему?

0

Решение

для Mysql автоматическая блокировка будет применена к таблице при выполнении любой вашей операции, записанной в вашем коде, так что вы в безопасности.

0

Другие решения

Других решений пока нет …