BEGIN TRANSACTION блокирует доступ к базе другим процессам, пока не выполнится COMMIT или как?
тут короче password_hash() завезли, функцию чтобы быдлокодеры перестали делать md5($_POST['password'])
алгоритмом хэширования, солью, уровнем сложности — всё это берёт на себя команда PHP и делает по-канонуЪ
просто быдлокодер должен использовать password_hash($_POST['password'], PASSWORD_DEFAULT)
так вот
суть в том, что в будущем могут изменяться алгоритмы хэширования и это всё учтено, что при каждом логине на сайт — надо проверять хэши и на всякий случай перегенерировать, если допустим команда PHP в следующем релизе изменит алгоритм для создания хэшей
if (password_needs_rehash($hash))
эта самая проверка занимает около секунды времени
секунды времени, Карл!
а перед этим в базу вносятся другие изменения, типа дата последней авторизации, куда же без неё, — и ради этого нужна транзакция, чтобы потом всё за раз.
и вооот
ты делаешь BEGIN TRANSACTION, база блокируются, все сосут и ждут пока пройдёт авторизация у одного пользователя
так что-ли получается?
if (password_verify($_POST['password'], $user_password_hash)) {
$dbh->query('BEGIN TRANSACTION');
/*
транзакция стоит, все сосут^Wждут одного пользователя,
пока не пройдёт проверка password_needs_rehash() при каждой авторизации!
*/
if (password_needs_rehash($user_password_hash, PASSWORD_DEFAULT, array('cost' => 13))) {
$try = $dbh->prepare('UPDATE user SET user_password_hash = :user_password_hash WHERE user_id = :user_id');
$try->bindValue(':user_id', $user_id);
$try->bindValue(':user_password_hash', password_hash($_POST['password'], PASSWORD_DEFAULT, array('cost' => 13)));
$try->execute();
}
// окей, едем дальше
$try = $dbh->prepare('UPDATE user SET user_date_authorized = CURRENT_TIMESTAMP WHERE user_id = :user_id');
$try->bindValue(':user_id', $user_id);
$try->execute();
// итог: транзакция продолжительностью в секунду-две
// это нормально?
$dbh->query('COMMIT');
скажите! транзакция блокирует базу для других процессов или нет?
и с новым годом!!