Фига се 6 человек подписалось на вопрос.
Для себя я этот вопрос решил.
И вот как:
Сам пул (pool.query) я использую для всех юзеров, если запрошен какой-то роутер, который просто выводит информацию (исключительно select запросы)
А для остальных роутеров(путей), где надо совершать какие-то действия со строками в БД (update,delete,insert) я внутри обработчика всё заворачиваю в try>catch>finaly
в try открываю новое соединение client = await pool.connect();
ставлю изоляцию serializable делаю все запросы, потом commit или rollback в зависимости от условий.
в finaly высвобождаю соединение
if (client) {client.release();}
И всё работает отлично, важно, чтобы внутри самого блока try, где есть транзакция не делать больше одного запроса update,insert к одним и тем же полям.
Ещё важно, если вы используете самую строгую изоляцию, во всех других путях тоже важно использовать такой же уровень изоляции.
Вот и всё