Я пытаюсь отладить какое-то странное поведение блокировки в моей базе данных и надеялся, что 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, как оно уже открылось (да, надеюсь)? Если так, это все еще находится в середине транзакции другого пользователя? Существует ли вероятность столкновения, когда ошибка в одном запросе будет ОТКАЧАТЬ ОБНОВЛЕНИЯ предыдущего пользователя, даже если проблем не было?
Я прочитал несколько документов и не нашел четкого ответа (возможно, потому что мне не хватает некоторых основ о том, как работают вышеупомянутые системы! Любая ясность в том, как это будет оценено по достоинству!