MySQL: рассово-верная блокировка в InnoDB

Тема в разделе "Базы данных", создана пользователем supernova, 17 янв 2011.

Модераторы: latteo
  1. supernova

    supernova Постоялец

    Регистр.:
    28 сен 2010
    Сообщения:
    127
    Симпатии:
    28
    Есть две таблицы: таблица А и таблица Б.

    Из таблицы А читаются данные в PHP скрипт и обрабатываются. Результаты обработки заносятся в таблицу Б, а данные в той же строке таблицы А модифицируются. Очевидно, что нужно блокировать таблицу А на запись на время обработки данных - что бы никто случайно не прочитал неправильный набор данных. Сейчас я это делаю следующим образом:
    START TRANSACTION;
    SELECT `datafield_a` FROM A WHERE `id` = '$id' LIMIT 1 FOR UPDATE;
    (здесь некоторое время обрабатываются данные)
    INSERT INTO B SET `datafield_b` = 'data_b';
    UPDATE A SET `datafield_a` = `new_data_a` WHERE `id` = '$id' LIMIT 1;
    COMMIT;

    Но все равно как-то получается, что данные в таблице A изменяются два раза! Очень долго курил доки в MySQL, про уровни блокировки, про транзакции и так далее, но все равно не понял - почему происходит такая фигня.

    Подскажите, как должна выглядеть последовательность команд? Ибо лочить целиком таблицу ради одной записи - некомильфо! И не для этого я с MyISAM переходил на InnoDB!