Решилось все стандартными средствами php.
Когда мы открываем сессию, то до её закрытия php не открывает параллельную сессию с таким же названием до тех пор пока мы не закроем текущую. Закрыть можно так же во время выполнения скрипта до его завершения
php.net/manual/en/function.session-write-close.php.
По умолчанию имя сессии приходит вместе с запросом, php сам устанавливает соответсвующую куку.
У меня случай когда сессий может быть несколько или вовсе не быть сессии для одного пользователя, поэтому я после авторизации задаю своё название для сессии из id пользователя + соли
session_id(hash('sha256',$userId+$salt);
В моем случае все запросы проходят через авторизацию пользователя и у меня всегда есть id пользователя
После я запускаю сессию
session_start()
И теперь все запросы от пользователя будут ожидать завершения текущего запроса и далее по очереди.
Этот же механизм можно сделать и через
php.net/manual/en/function.flock.php как писал
lusin , но тогда нам придется самим заботиться о хранилище лок файлов, проверки снятия лока, сборке мусора и т.д.
В случае когда нужно дождаться какого то общего лока который растягивается на несколько пользователей, в таком случае нам уже придется пользоваться
php.net/manual/en/function.flock.php либо блокировкой таблицы или строки как предложил
Rsa97 .
В данном же случае было достаточно использовать стандартный механизм сессий