update лочит всю таблицу

antonim123
Дата: 18.12.2012 14:45:28
Элементарный запрос:

update table
set field = field2 * 0.2;

В таблице 10 000 000 записей. Мне нужно чтобы update срабатывал по-очереди для каждой строки... кто подскажет как это сделать на mysql?
miksoft
Дата: 18.12.2012 14:47:36
Движок таблиц какой?
antonim123
Дата: 18.12.2012 15:02:42
innoDB


Еще раз проблема в том что когда делается запрос (а он делается несколько минут) доступ к базе на update закрыт... А он нужен!
trew
Дата: 18.12.2012 15:10:47
antonim123,

Блокировки в InnoDB (шпаргалка)
antonim123
Дата: 18.12.2012 15:18:21
trew,

спасибо, но там нет решения моей проблемы
miksoft
Дата: 18.12.2012 15:40:20
antonim123,

Можно попытаться разбить update на части, но вряд ли это сильно облегчит дело, ведь тогда встанет проблема обнаруживать непроапдейченные записи.

Собственно, непонятно, а зачем эту операцию вообще делать более одного раза?
trew
Дата: 18.12.2012 15:43:05
antonim123
trew,
спасибо, но там нет решения моей проблемы

В таком случае, не скупитесь на описание проблемы.

Опишите подробно, как пользователи выполняют запросы:
какой уровень изоляции используется (для каждого пользователя), структура таблицы и индексы.
Может в профайлере видно какой тип блокировки используется?
antonim123
Дата: 18.12.2012 16:40:31
я решил проблему как деревня, а именно:

Разбил update на маленькие кусочки и по-очереди из php вызывал, но это ужасный костыль..

Основная задача: не лочить таблицу на update больше чем на 0,5 сек. В принципе у меня получилось, но это костыль, хотелось бы понять как это нормально делать.
trew
Дата: 18.12.2012 17:27:45
antonim123,

В настройках MySQL ( /etc/mysql/my.cnf ) использовать принудительно уровень изоляции транзакций READ-COMMITTED.
transaction-isolation = READ-COMMITTED
Запомните что там было, чтобы можно было назад вернуть настройку.

или перед запуском UPDATE написать:
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;

Увидеть текущий уровень изоляции
hallabud
Дата: 18.12.2012 18:27:54
antonim123
Мне нужно чтобы update срабатывал по-очереди для каждой строки...

Может курсором?