Я хочу добиться блокировки на уровне строк с помощью PHP в MySQL

Я разрабатываю эту страницу, где пользователи увидят заказы на изменения за день. Я хочу, чтобы за один раз редактировал только один человек. В то время как другой пользователь все еще может редактировать другой порядок изменений. Код, который я вставляю, предназначен для последней страницы, куда пользователь перенаправляется после нажатия на конкретный порядок изменений. Пожалуйста, помогите мне, приведя пример, так как я очень новичок в php и mysql. Заранее спасибо.
`

<?php
$change = $_GET['value'];
mysqli_query('BEGIN');
$sql="SELECT  * FROM cat_firewall USE INDEX(id) WHERE chg_id='$change' FOR UPDATE";
$result=mysqli_query($con,$sql);

// Count table rows
$count=mysqli_num_rows($result);
?>
---MORE CODE----
while ($row = mysqli_fetch_array($result)){ ?>
<tr>
---MORE CODE----

<?php

$source_FW = $_POST['source_FW'];
$source_ACL =  $_POST['source_ACL'];
$destination_FW = $_POST['destination_FW'];
$destination_ACL =  $_POST['destination_ACL'];


if(isset($_POST['Submit'])){


foreach($source_FW as $key=>$value){
$sql1="UPDATE cat_firewall SET source_FW='$value' WHERE entry_id='$key' AND chg_id='$change' ";
$result=mysqli_query($con,$sql1);
}
foreach($source_ACL as $key1=>$value1){
$sql2="UPDATE cat_firewall SET source_ACL='$value1' WHERE entry_id='$key1' AND chg_id='$change'  ";
mysqli_query($con,$sql2);
}
foreach($destination_FW as $key2=>$value2){
$sql3="UPDATE cat_firewall SET destination_FW='$value2' WHERE entry_id='$key2' AND chg_id='$change' ";
mysqli_query($con,$sql3);
}
foreach($destination_ACL as $key3=>$value3){
$sql4="UPDATE cat_firewall SET destination_ACL='$value3' WHERE entry_id='$key3' AND chg_id='$change'  ";
mysqli_query($con,$sql4);
}

echo "update complete";
}

sleep(120);
mysqli_query($con,'COMMIT');
?>'

`

1

Решение

Я хочу заблокировать его, как только пользователь нажмет на порядок изменений и перейдет на эту страницу, чтобы редактировать строки и снять блокировку строки после нажатия кнопки «Отправить».

Это большой красный флаг. Вы не должны ожидать, что блокировка InnoDB будет работать с ледяной скоростью человека.

Оптимистическая версия:

  • Имейте порядковый номер для обновлений, которые происходят.
  • Возьмите этот номер на Начните пользователя, глядя на значения и почесывая голову.
  • Позвольте пользователю (с ледяной скоростью) вносить изменения.
  • Теперь отправьте обновления и порядковый номер вернуться к клиентскому API, который делает

Следующие:

BEGIN;
SELECT seq_num ... FOR UPDATE;
if the seq_num has changed, ROLLBACK this transaction and tell the user to start over.
else...
do the UPDATEs
update seq_num to a new number
COMMIT;

Пессимистический подход …

BEGIN;
SELECT who_is_editing FROM ... FOR UPDATE;
if someone else is editing, ROLLBACK and tell user to "try again later".
else...
UPDATE ... who_is_editing = $this_user;
COMMIT;

Теперь перейдите к тому, чтобы позволить пользователю делать все, что он хочет. Но, в конце концов, ясно, who_is_editing,

Предостережение: если пользователь просто исчезает, эта «блокировка» может никогда не быть снята. Так…

  • Имейте некоторую проверку работы для этого.
  • Предупредите пользователя, что у него есть ограниченное количество времени для внесения изменений.
  • проверить внутри транзакции ОБНОВЛЕНИЕ что пользователь все еще соответствует who_is_editing, Если не дать ему пощечину, сказать ему «ты слишком долго!».

(Предостережение: оба эти подхода были набраны наспех; пожалуйста, внимательно изучите, ищите дыры в логике.)

0

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

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

По вопросам рекламы [email protected]