У меня возникает несколько проблем, когда люди пытаются получить доступ к базе данных MySQL и пытаются обновить таблицы с той же информацией.
У меня есть веб-страница, написанная с использованием PHP. На этой веб-странице находится запрос, чтобы проверить, были ли введены определенные данные в базу данных. Если данных нет, я приступаю к его вставке. Беда в том, что если два человека попытаются в одно и то же время, проверка может сказать, что данные еще не были введены, но когда вставка происходит, она была у другого человека.
Каков наилучший способ справиться с этим сценарием? Могу ли я заблокировать базу данных, чтобы обрабатывать только мои запросы, а затем другие?
Вы ищете LOCK
.
http://dev.mysql.com/doc/refman/5.0/en/lock-tables.html
Это можно запустить как простой mysql_query
(или MySQLi::query/prepare
).
Я бы сказал, что лучше блокировать определенные таблицы (хотя вы, вероятно, можете попробовать LOCK TABLES *
), которые нужно заблокировать, а не всю базу данных, поскольку ничто не сможет быть прочитано. Я думаю, вы ищете что-то вроде:
LOCK TABLES items; START TRANSACTION; INSERT INTO items (name, label) VALUES ('foo', 'bar'); UNLOCK TABLES;
Или в PHP:
mysql_query('LOCK TABLES items'); mysql_query("INSERT INTO items (name, label) VALUES ('foo', 'bar')"); mysql_query('UNLOCK TABLES');
Прочитайте транзакции базы данных . Вероятно, это лучший способ справиться с тем, что вам нужно, чем запустить LOCK TABLES.
Столбцы с ручным затвором – это самое худшее, что вы могли бы сделать. Что произойдет, если код для их разблокировки никогда не будет выполняться (потому что PHP терпит неудачу, или пользователь следующий щелчок на следующем шаге, уходит от ПК и т. Д.).
Один из способов свести к минимуму это в веб-приложении и часто ошибочных разработчиков – это иметь полный набор текстовых полей для редактирования данных с помощью кнопки сохранения для каждой строки или всей таблицы. Очевидно, если человек откроет это в пятницу и вернется в понедельник, данные могут быть неправильными, и они могут сэкономить на новых данных. Один простой способ исправить это – вместо этого иметь кнопки EDIT в каждой строке, а затем щелкнуть кнопкой, а затем загрузить форму редактирования, таким образом они, надеюсь, будут загружать свежие данные и могут отправлять только одно изменение строки за раз.
Но что еще более важно, вы должны включить поле datetime в качестве скрытого поля ввода, и когда они попытаются отправить данные на дату и решить, сколько лет данные и принять решение, сколько лет прошло слишком давно, а также предупреждать или отрицать пользователь об их действии.
Вы можете проверить, были ли данные изменены, прежде чем что-либо редактировать. В этом случае, если кто-то редактировал данные, а другой человек делает свое редактирование, он будет проинформирован об этом.
Как вроде stackoverflow обрабатывает комментирование.