Какова взаимосвязь php -fpm, PHP PDO с транзакциями ATTR_PRESISTENT и БД - PullRequest
1 голос
/ 04 марта 2020

Я пытаюсь отладить какое-то странное поведение блокировки в моей базе данных и надеялся, что PDO :: ATTR_PERSISTENT поможет в качестве кратковременного сокращения подключений к нашей базе данных. Кроме того, у нас большие накладные расходы на создание подключений, поэтому я пытаюсь уменьшить это, не открывая как можно больше подключений (да, я знаю о таких вещах, как pgbouncer, и мы планируем установить это).

Позвольте мне описать стек и проблему. Во-первых, мы используем балансировщик нагрузки с 3 EC2. Каждый EC2 работает с AMI с pg sql, php -fpm (php 7.2) и nginx. У нас есть несколько сотен php рабочих в минуту на каждый сервер, обрабатывающий запросы. Мы используем PostGres 10.1

Наш код выполняет следующие действия для подключения к БД (примечание: предлагаемое изменение заключается в добавлении ATTR_PERSISTENT)

$db = new \PDO(pgsql:host=host;dbname=dbName,$user,$password,array(\PDO::ATTR_PERSISTENT => true));

Теперь у нас есть некоторые код, который выполняет следующее:

$db->beginTranscation(); //BEGIN;

$errors = false;
$errors |= $db->updateTableOne($one, $two); // UPDATE table SET one=$one WHERE two=$two;
$errors |= $db->updateTableOne($one, $three); // UPDATE table SET one=$one WHERE two=$three;
$errors |= $db->updateTableOne($one, $four); // UPDATE table SET one=$one WHERE two=$four;
$errors |= $db->updateTableOne($one, $five); // UPDATE table SET one=$one WHERE two=$five;
$errors |= $db->insertFinal($allThings); // INSERT INTO another_table (one,two,three) VALUES (1,2,3),(4,5,6)

if($errors == true) {
    $db->rollback(); // ROLLBACK
} else {
    $db->commit(); // COMMIT
}

Моя основная проблема заключается в том, чтобы - при вышеупомянутой настройке, возможно ли, что рабочий с php -fpm получит запрос, затем на полпути через ОБНОВЛЕНИЯ выше (или во время INSERT) он заблокирует ввод-вывод базой данных, а затем go обработает другой запрос. Если это может произойти, будет ли PDO_ATTR_PERSISTENT использовать то же самое соединение с PostGres, как оно уже открылось (да, надеюсь)? Если так, это все еще находится в середине транзакции другого пользователя? Существует ли вероятность столкновения, когда ошибка в одном запросе будет ОТКАЧАТЬ ОБНОВЛЕНИЯ предыдущего пользователя, даже если проблем не было?

Я прочитал несколько документов и не нашел четкого ответа (возможно, потому что мне не хватает некоторых основ о том, как работают вышеупомянутые системы! Любая ясность в том, как это будет оценено по достоинству!

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