Как блокировки базы данных и веб-сервер взаимодействуют в отношении сеансов базы данных? - PullRequest
0 голосов
/ 11 октября 2018

Этот вопрос имеет широкую область, например, веб-серверы, серверы баз данных, php-приложения и т. Д., И поэтому я сомневаюсь, что он относится к stackoverflow, однако, поскольку этот вопрос поможет нам в том, как написать код приложения, я решилчтобы спросить это здесь.

У меня путаница в том, как сеансы базы данных и веб-серверы работают вместе.Если я прав, когда выполняется соединение для клиента, для этого соединения будет создан ТОЛЬКО один сеанс, который будет продолжаться до тех пор, пока соединение не будет отключено или оно будет повторно подключено из-за длительного отсутствия активности.

Теперь, если мы рассмотрим веб-сервер, в частности Apache 2.4, на котором выполняется приложение PHP 7.2 (на виртуальном хосте) с базой данных, поддерживаемой MariaDB 10.3.10 (на Fedora 28, если это вообще имеет значение), я предполагаюследующий сценарий (пожалуйста, исправьте меня, если я ошибаюсь):

  • Для каждого веб-приложения, в настоящее время мы используем Laravel, будет выполнено только одно соединение с базой данных, как только первый запрос попадет наURL, которые он обслуживает.
  • Впоследствии для этого будет использоваться только ОДИН сеанс базы данных.Когда запрос обслуживается, соединения остаются активными для повторного использования другими запросами, которые получает приложение.Это означает, что, скорее всего, если приложение непрерывно получает веб-запросы 24 x 7, соединение также будет поддерживаться в рабочем состоянии и будет отключено только после перезапуска mysqld или httpd, что может даже не произойти в течение нескольких месяцев.
  • Посколькувсе пользователи приложения, скажем, около 20 пользователей одновременно, используют одни и те же серверы Apache и файлы приложений Laravel (я полагаю, я могу назвать это экземпляром приложения), все 20 пользователей будут обслуживаться через одно и то же соединение с базой данных иСеанс базы данных.

Если все упомянутые выше варианты использования верны, то концепция блокировки базы данных кажется очень запутанной.Допустим, мы выполнили бы эксклюзивную блокировку, например lock tables t1 write;, она будет блокировать чтение и запись других сеансов, чтобы избежать грязных операций чтения и записи для одновременных сеансов. Однако, поскольку все 20 пользователей используют один и тот же сеанс и соединение одновременно , мы не получим необходимую безопасность параллелизма из механизма блокировки базы данных.

Вопросы:

  1. Как работает блокировка базы данных, явно эксклюзивная блокировка в терминах веб-приложений?
  2. Будет ли каждый веб-запрос, полученный в приложении Laravel, создавать новое соединение и сеанс, или ТОЛЬКО одно соединение и сеансповторно используется?
  3. Будет ли каждое соединение с базой данных иметь только и только ОДИН сеанс одновременно?
  4. Будет ли эта команда отображать текущие активные сеансы или соединения show status where имя_переменной = 'Threads_connected'?Если он показывает текущие активные соединения, как мы можем получить текущие активные сеансы базы данных?

1 Ответ

0 голосов
/ 11 октября 2018

Apache не имеет ничего общего с сессиями в этом сценарии (в основном).Соединения с базой данных и сеансы обрабатываются самим php.

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

При включенном пуле соединений поток, обслуживающий запрос, запросит соединение из пула с менеджером процессов (будь то fpm или mod_php) и вернет соединение available из пула, носессий будет по крайней мере столько же, сколько одновременных запросов (если вы не достигнете какого-либо из ограничений max_).Общая справочная информация содержит более подробные сведения, но в качестве основного замечания:

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

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

Для получения дополнительной информации вы можете обратиться к справочнику соединений и постоянным соединениям расширения mysqli.

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

...