SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 26.01.2019 14:12:29

webJunior
Завсегдатай
Зарегистрирован: 30.03.2017
Сообщений: 30

Вопрос про конкурентные запросы

Здравствуйте, просьба объяснить один момент. Допустим есть код, который добавляет новую категорию.


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)

Неактивен

 

#2 28.01.2019 14:21:57

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5827

Re: Вопрос про конкурентные запросы

блокируется не вся таблица, а строки, которые читает транзакция.
да, решается проблема с параллельными транзакциями.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson