Лучший способ управления параллелизмом при редактировании темы - PullRequest
1 голос
/ 27 апреля 2011

У меня на сайте есть данные (написанные на PHP и MySql), которые пользователи могут редактировать.

Как вы знаете, если User A откроет окно редактирования, и во время этого редактирования другой User B откроет то же самое поле редактирования, один из этих пользователей потеряет свои ревизии (тот, кто первым закончил).

Итак, я реализовал своего рода Access Time (20 минут) для первого пользователя, который пытается редактировать. Это код:

$dateBlock=date("Y-m-d H:i:s");
$update=mysql_query("UPDATE tracklist SET block_user='".$_SESSION['nickname']."', block_date='".$dateBlock."' WHERE 
(trackid='".$_GET['trackid']."' AND block_user='') or 
(trackid='".$_GET['trackid']."' AND block_user='".$_SESSION['nickname']."') or 
(trackid='".$_GET['trackid']."' AND block_date<SUBTIME('".$dateBlock."', '0:20'))",$mydb);
$updatedRows=mysql_affected_rows();
if($updatedRows==0) $messaggio="Sorry but another User is editing this tracklist";

Но мне не нравится такой подход.

Что вы можете мне предложить? Например, что такое подход к stackoverflow?

Ответы [ 3 ]

2 голосов
/ 27 апреля 2011

лучший подход состоит в том, чтобы аннулировать второе издание, потому что вы можете отреагировать, предупреждая ситуацию.
Чтобы управлять таким образом, вы должны отслеживать инкрементный "editionID", поэтому обе сессии получают один и тот же editionID, когда ониначните редактирование, при первом отправлении (и при транзакции), если editionID является текущим, вы принимаете редакцию (и увеличиваете editionID), в противном случае (во второй браузер) вы даете сообщение, указывающее на ситуацию. Имейте в виду, что этот подходдействителен только в случае низкой вероятности коллизии.

2 голосов
/ 27 апреля 2011

Вам нужно будет выбрать один из двух вариантов:

Как подсказал один из ответов: заблокируйте текстовое поле до его отправки, тем самым исключив, что кто-то другой может изменить его в это время

Следите за различными версиями, как предложил другой пользователь, вместо того, чтобы всегда обновлять контент, всегда добавляя новый контент с полем, которое указывает версию, чтобы люди могли видеть разные версии, или если вы хотите это сделать быстрее, просто отследите время отправки, чем вы можете легко отсортировать результаты по времени отправки

Улучшение, которое вы также можете предоставить, заключается в том, чтобы информировать пользователя об обновлении поста с момента его открытия в тот момент, когда он хочет отправить свои изменения, сравнивая версию / время отправки с постом, который он скачал. Он может сначала взглянуть на него и интегрировать изменения.

0 голосов
/ 27 апреля 2011

Лучше всего было бы заблокировать поля редактирования через веб-сокеты, если они открыты кем-то другим ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...