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

supernova

Постоялец
Регистрация
27 Сен 2010
Сообщения
129
Реакции
29
Есть две таблицы: таблица А и таблица Б.

Из таблицы А читаются данные в 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!
 
Назад
Сверху