Блокировка базы данных MySQL, чтобы запрос мог выполнить только один человек? - PullRequest
5 голосов
/ 14 января 2009

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

У меня есть веб-страница, написанная с использованием PHP. На этой веб-странице есть запрос, чтобы проверить, были ли определенные данные введены в базу данных. Если данных нет, тогда я продолжаю вставлять их. Проблема в том, что если два человека пытаются одновременно, проверка может сказать, что данные еще не были введены, но когда вставка произошла, это сделал другой человек.

Каков наилучший способ справиться с этим сценарием? Могу ли я заблокировать базу данных, чтобы сначала обрабатывать только мои запросы, а затем другие?

Ответы [ 4 ]

5 голосов
/ 14 января 2009

Чтение транзакций базы данных . Это, вероятно, лучший способ справиться с тем, что вам нужно, чем запуск LOCK TABLES.

3 голосов
/ 15 января 2009

Ручная блокировка таблиц - худшее, что вы могли когда-либо делать. Что произойдет, если код для их разблокировки никогда не запустится (потому что PHP не работает, или пользователь нажимает следующий шаг, уходит с ПК и т. Д.).

Один из способов свести это к минимуму в веб-приложении, и распространенная ошибка, которую делают разработчики, состоит в том, чтобы иметь сетку данных, полную текстовых полей данных для редактирования, с кнопкой сохранения для строки или всей таблицы. Очевидно, что если человек откроет это в пятницу и вернется в понедельник, данные могут быть неверными, и они могут сохранять новые данные. Один из простых способов исправить это - вместо этого иметь кнопки РЕДАКТИРОВАНИЯ в каждой строке, и, нажав кнопку, затем загружается форма редактирования, таким образом, они, как мы надеемся, загружают свежие данные и могут отправлять только 1 изменение строки за раз.

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

1 голос
/ 14 января 2009

Вы ищете 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');
0 голосов
/ 14 января 2009

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

Вроде как stackoverflow обрабатывает комментарии.

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