Задавайте вопросы, мы ответим
Вы не зашли.
Всем, здравствуйте.
Стоящая задача - выбрать нужные данные и установить флаг выборки.
При этом данные постоянно добавляются и обновляются, поэтому установка флага должна коснуться только выбранных на предыдущем шаге строк.
Скажем
BEGIN TRANSACTION;
SELECT * FROM docs WHERE docs.sync_1c=FALSE;
UPDATE docs SET docs.sync_1c=TRUE;
COMMIT;
Чего я опосаюсь - что между SELECT и UPDATE "извне" произойдет добавление строк(и) и UPDATE установит флаг на строку, которая не была захвачена SELECT'ом.
Возможно ли такое? Или транзакция от такого защищает?
А если не защищает - то что делать? - Устанавливать ISOLATION LEVEL? Какой?
Заранее спасибо за помощь.
Неактивен
В селект добавить for update;
Неактивен
Да, если задача именно заблокировать таблицу — то SELECT FOR UPDATE
или явно: LOCK TABLES docs WRITE; SELECT ... ; UPDATE ... ; UNLOCK TABLES.
На уровне транзакций — можно выбрать уровень SERIALIZABLE всеми кли-
ентами.
Неактивен
paulus написал:
Да, если задача именно заблокировать таблицу — то SELECT FOR UPDATE
или явно: LOCK TABLES docs WRITE; SELECT ... ; UPDATE ... ; UNLOCK TABLES.
На уровне транзакций — можно выбрать уровень SERIALIZABLE всеми кли-
ентами.
Нет, задача как раз НЕ БЛОКИРОВАТЬ таблицу. Потому как в нее постоянно валятся данные.
Задача - SELECT'ом выбрать свежие данные, которые еще не выбраны(sync_1c=0).
Затем UPDATE'ом уставить флаг (sync_1c=1) на те данные, которые были выбраны предыдущим SELECT'ом, ПРИ ЭТОМ НЕ ЗАДЕВ ТЕХ ДАННЫХ, которые были добавлены в базу "извне" в промежутке, между SELECT и UPDATE.
Неактивен
Тогда SERIALIZABLE. Ну или схитрить и обновлять по ID (всё равно же Вы
их выбираете).
Неактивен