LINUX.ORG.RU

BEGIN TRANSACTION; password_needs_rehash(); /* СОСНУЛИ ВСЕ */; COMMIT

 


0

1

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');

скажите! транзакция блокирует базу для других процессов или нет?

и с новым годом!!

★★★★★
Ответ на: комментарий от znenyegvkby

Ну и если вы потратите 15-20 минут личного времени и почитаете о моделях транзакций, вы поймете что для изменения одной записи, совсем не обязательно блокировать их целыми пачками=)

вроде у mysql сторадж myisam блочит всю таблицу уже просто чтобы сделать инсерт, не? xD Много позже добавили опцию concurrent_inserts=N, но вопреки названию она все равно не умеет в собственно concurrent inserts, а только перестает мешать паралелльным селектам (инсерты продолжают стоять в синхронизованной очереди). С другой стороны, это не совсем честно, тк myisam не умеет в транзакции. Такшта боюсь для проверки утверждения под всеми популярными БД 15 минутами тут не ограничится :(

stevejobs ★★★★☆
()
Последнее исправление: stevejobs (всего исправлений: 1)
Ответ на: комментарий от stevejobs

С другой стороны, это не совсем честно, тк myisam не умеет в транзакции.

Если вы это знаете, тогда для чего ставите myISAM в пример? Это не транзакционный движок, я конечно извиняюсь, но мы вроде бы говорим именно о транзакциях здесь=) и ваше замечание

вроде у mysql сторадж myisam блочит всю таблицу уже просто чтобы сделать инсерт, не? xD

в контексте моего комментария и обсуждаемой темы совсем не уместно.

znenyegvkby
()
Ответ на: комментарий от stevejobs

Ну и конечно мое замечание

Ну и если вы потратите 15-20 минут личного времени и почитаете о моделях транзакций, вы поймете что для изменения одной записи, совсем не обязательно блокировать их целыми пачками=)

конечно преувеличенно по времени, но опять же, повторюсь, это время будет потрачено только для понимания основ модели транзакции, и совсем не даст понимания разных вариантов реализации этой самой модели у каких-либо конкретных продуктов. В этом я безусловно с вами согласен=)

znenyegvkby
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.