Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MySQL > подкл. к БД в многопользовательских запросах


Автор: Luchi 31.10.2013, 17:03
Может кто объяснить! БД MySQL в ней 2 таблицы.
На сайте в БД в 1 таб. хранятся данные о регистрации пользователей, во 2-й инфа от пользователей. Классы пока не пишу. Пробую накидать скелет всего по простому, т.к. окончательного варианта пока нет. Сделал ф-ю для подключения к БД, ф-и для работы с БД и ф-ю для отключения и очистки переменных. Ф-и сделал, чтобы не писать данные для подключения на разных скриптах сайта, т.к. страниц на сайте больше 10-ти.
Вопросы в следующем:
1. Нужно ли открыто указывать в ф-и данные для подключения к БД или это делается иначе?
2. К примеру на одной из страниц пользователь запустил скрипт, идет подключение к БД, проверка что пользователь зарегистрирован, получение и вывод данных по его запросу. Для него формируется страница, от БД он еще не отключился. На этом этапе другой пользователь открывает другую страницу, делает запрос и для него все идет по тому же сценарию. Т.к. сервера сейчас стоят многоядерные + параллельно может идти несколько процессов, поэтому пока выполнится один скрипт запустится уже другой. В итоге запросы либо могут перепутаться, а вероятнее всего просто возникнет ошибка, когда с БД будет работать несколько пользователей. В mysql_query дескрипторы не указываю. Достаточно для каждого нового запроса подключаться к БД и получать дескриптор, чтобы не было ошибок между разными подключениями к БД?
3. Нужно ли для каждого пользователя создавать новое подключение или есть способ отправлять запросы на одном созданном подключении для разных пользователей?
4. Нужно ли тогда каждый раз закрывать подключение или можно один раз получить дескриптор и отправлять запросы используя его?
Вообщем хотелось бы понять, как грамотно организовать этот момент.

Автор: Fortop 2.11.2013, 12:47
Цитата(Luchi @  31.10.2013,  17:03 Найти цитируемый пост)
1. Нужно ли открыто указывать в ф-и данные для подключения к БД или это делается иначе?

Обычно это выносится в конфигурационные файлы для легкости настраивания.

Цитата(Luchi @  31.10.2013,  17:03 Найти цитируемый пост)
 В итоге запросы либо могут перепутаться

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

Цитата(Luchi @  31.10.2013,  17:03 Найти цитируемый пост)
а вероятнее всего просто возникнет ошибка, когда с БД будет работать несколько пользователей.

Не возникнет. Большинство БД рассчитаны на многопользовательскую работу. Опять же - используйте транзакции, когда это нужно.

Цитата(Luchi @  31.10.2013,  17:03 Найти цитируемый пост)
3. Нужно ли для каждого пользователя создавать новое подключение или есть способ отправлять запросы на одном созданном подключении для разных пользователей?

Есть способ, зависящий от языка на котором пишете и БД. Называется пул соединений. Для общего ознакомления http://habrahabr.ru/post/194142/

Цитата(Luchi @  31.10.2013,  17:03 Найти цитируемый пост)
 Нужно ли тогда каждый раз закрывать подключение или можно один раз получить дескриптор и отправлять запросы используя его?

Не нужно. Можно.

Автор: Luchi 4.11.2013, 20:23
Спасибо Fortop за ответ, немного подправил свой код.
Пишу на PHP, версия на хосте 5.3, версия MySQL 5.1.

Для использования транзакции нужны типы таблиц InnoDB или BDB. MySQL, который стоит на хосте этот тип таблиц не поддерживает. Поэтому вопрос 2 актуален.

По поводу использования дескриптора, в мануале, закрывать соединение не обязательно, так как его, при завершении скрипта, php закроет автоматом, закрывать вручную просто правило хорошего кода. Но возникает вопрос, если я буду использовать одно соединение для всех, то, 1-й скрипт пойдет поэтому подключению, пойдет 2-й. 1-й завершится и автоматом завершит соединение, а 2-й еще будет выполняться и здесь возникнет ошибка?

Автор: baldina 4.11.2013, 22:31
Luchi, при работе с одной таблицей ничего не перепутается даже без транзакций. за это отвечает субд.

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)