Этот вопрос имеет широкую область, например, веб-серверы, серверы баз данных, 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 пользователей используют один и тот же сеанс и соединение одновременно , мы не получим необходимую безопасность параллелизма из механизма блокировки базы данных.
Вопросы:
- Как работает блокировка базы данных, явно эксклюзивная блокировка в терминах веб-приложений?
- Будет ли каждый веб-запрос, полученный в приложении Laravel, создавать новое соединение и сеанс, или ТОЛЬКО одно соединение и сеансповторно используется?
- Будет ли каждое соединение с базой данных иметь только и только ОДИН сеанс одновременно?
- Будет ли эта команда отображать текущие активные сеансы или соединения
show status where
имя_переменной = 'Threads_connected'
?Если он показывает текущие активные соединения, как мы можем получить текущие активные сеансы базы данных?