supernova
Постоялец
- Регистрация
- 27 Сен 2010
- Сообщения
- 129
- Реакции
- 29
- Автор темы
- #1
Есть две таблицы: таблица А и таблица Б.
Из таблицы А читаются данные в 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!
Из таблицы А читаются данные в 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!