Гарантировать, что операторы выбора для одного пользователя верны для другого, когда пользователь обновляется? - PullRequest
1 голос
/ 09 декабря 2011

Как я могу гарантировать, что если пользователь-a вручную обновляет часть своей информации, когда пользователь-b обращается к данным пользователя-a, этот пользователь-b, получающий доступ к информации, получает правильную обновленную информацию, а не старые устаревшие данные для пользователя? а.

Я понимаю, что транзакция хороша и блокировка на уровне строк, я просто хочу убедиться, что я делаю это правильно!

При обновлении информации о пользователе, которую я использую,

$dbc -> beginTransaction();
$dbc -> query("SELECT id FROM accounts WHERE id = " . $user['id'] . " FOR UPDATE LIMIT 1");
$q = $dbc -> prepare("UPDATE accounts SET name = ?");
$q -> execute(array($_POST['name']));
$dbc -> commit();

Использование вышеизложенного блокирует данные пользователя a, так что когда пользователь b получает свои данные для пользователя a,

$q = $dbc -> ("SELECT * FROM accounts WHERE id = ?");
$q -> execute(array($_GET['id']));

Он получит правильные обновленные данные? Или мне нужно использовать транзакцию при получении данных user-a для user-b ??

Меня немного смущают все эти блокировки и прочее, как вы, вероятно, можете сказать?!?

Спасибо

1 Ответ

0 голосов
/ 09 декабря 2011

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

Либо в столбце даты последнего обновления, либо (в моем предпочтении) с автоматически введенным номером версии (реализованным с помощью триггера), вам просто нужно проверить в предложении WHERE, что полученное вами значение соответствует значению в записи, например:

UPDATE accounts SET name = ?, lastupdate=sysdate WHERE id = ? AND lastupdate = ? 

Если значение lastupdate не совпадает, и, следовательно, вы не можете обновить запись, вы можете предположить, что данные были обновлены кем-то другим, и обработать исключение соответствующим образом.

Это хорошо работает для систем, в которых пересекающиеся обновления встречаются редко.

Я предпочитаю использовать триггеры, так как значение параллелизма поддерживается для вас. (единственный недостаток в том, что вы должны запрашивать данные, если хотите повторно обновить ту же запись, то есть до тех пор, пока mysql не реализует предложение RETURNING)

см .: Обработка одновременного запроса при сохранении в базе данных Oracle?

...