SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 28.06.2011 17:06:51

sigmov
Участник
Зарегистрирован: 17.03.2011
Сообщений: 3

Изоляция пары SELECT\UPDATE

Всем, здравствуйте.

Стоящая задача - выбрать нужные данные и установить флаг выборки.
При этом данные постоянно добавляются и обновляются, поэтому установка флага должна коснуться только выбранных на предыдущем шаге строк.

Скажем

BEGIN TRANSACTION;
SELECT * FROM docs WHERE docs.sync_1c=FALSE;
UPDATE docs SET docs.sync_1c=TRUE;
COMMIT;

Чего я опосаюсь - что между SELECT и UPDATE "извне" произойдет добавление строк(и) и UPDATE установит флаг на строку, которая не была захвачена SELECT'ом.

Возможно ли такое? Или транзакция от такого защищает?
А если не защищает - то что делать? - Устанавливать ISOLATION LEVEL? Какой?

Заранее спасибо за помощь.

Неактивен

 

#2 28.06.2011 17:58:05

simple
Активист
Зарегистрирован: 25.11.2010
Сообщений: 168

Re: Изоляция пары SELECT\UPDATE

В селект добавить for update;

Неактивен

 

#3 28.06.2011 18:20:26

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Изоляция пары SELECT\UPDATE

Да, если задача именно заблокировать таблицу — то SELECT FOR UPDATE
или явно: LOCK TABLES docs WRITE; SELECT ... ; UPDATE ... ; UNLOCK TABLES.

На уровне транзакций — можно выбрать уровень SERIALIZABLE всеми кли-
ентами.

Неактивен

 

#4 29.06.2011 09:48:46

sigmov
Участник
Зарегистрирован: 17.03.2011
Сообщений: 3

Re: Изоляция пары SELECT\UPDATE

paulus написал:

Да, если задача именно заблокировать таблицу — то SELECT FOR UPDATE
или явно: LOCK TABLES docs WRITE; SELECT ... ; UPDATE ... ; UNLOCK TABLES.

На уровне транзакций — можно выбрать уровень SERIALIZABLE всеми кли-
ентами.

Нет, задача как раз НЕ БЛОКИРОВАТЬ таблицу. Потому как в нее постоянно валятся данные.

Задача - SELECT'ом выбрать свежие данные, которые еще не выбраны(sync_1c=0).
Затем UPDATE'ом уставить флаг (sync_1c=1) на те данные, которые были выбраны предыдущим SELECT'ом, ПРИ ЭТОМ НЕ ЗАДЕВ ТЕХ ДАННЫХ, которые были добавлены в базу "извне" в промежутке, между SELECT и UPDATE.

Неактивен

 

#5 29.06.2011 13:56:49

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Изоляция пары SELECT\UPDATE

Тогда SERIALIZABLE. Ну или схитрить и обновлять по ID (всё равно же Вы
их выбираете).

Неактивен

 

Board footer

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