Здравствуйте, просьба объяснить один момент. Допустим есть код, который добавляет новую категорию.
try {
$pdo->query('SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE');
$pdo->beginTransaction();
$parent = $pdo->query('SELECT right_key FROM categories WHERE id = '.$parent_id)->fetch();
$pdo->query('UPDATE categories SET left_key = left_key + 2, right_key = right_key + 2 WHERE left_key > '.$parent['right_key']);
$pdo->query('UPDATE categories SET right_key = right_key + 2 WHERE right_key >= '.$parent['right_key'].' AND left_key < '.$parent['right_key']);
$pdo->query('INSERT INTO categories (left_key, right_key) VALUES ('.$parent['right_key'].', '.$parent['right_key'] + 1 .')');
$pdo->commit();
return true;
} catch (PDOException $e) {
$pdo->rollBack();
}
Меня интересует момент, когда одновременно несколько сессий, пытаются создать новую категорию. Я правильно понимаю, что при включении уровня изоляции SERIALIZABLE, таблица на время будет заблокирована на изменение и остальные сессии будут в очереди дожидаться commit или roolback, т.е таким образом решается проблема с параллельными транзакциями?
Отредактированно webJunior (26.01.2019 14:12:55)