Prolix
Новичок
Несколько процессов, одна база данных
Здравствуйте!
Существует довольно простенькая база данных, например, с такими полями:
- уникальный идентификатор
- заголовок, по умолчанию пустой
- поле даты создания записи
Существует скрипт, который запускается каждый определенный промежуток времени (например, раз в пять минут), обходит базу по тем полям, у которых пустой title (они были занесены в нее другим сторонним скриптом) и заполняет title при помощи UPDATE на основе имеющейся функции.
Проблема может возникнуть, как можно догадаться, в том, что пока один скрипт выполняется, в этот момент может запуститься другой. И он начинает обрабатывать также те поля, которые "на себя взял" предыдущий процесс. Обработка происходит стандартнтым обращением к базе (в моем случае - pg_query... pg_fetch_array), и даже если вставить в цикл обработки SELECT условие проверки на пустой title, оно не помогает, т.к. запрос, судя по всему, и все обрабатываемые записи на его момент сохраняются в памяти.
Интересует возможность обхода этой ошибки. Т.е. последний запущенный процесс не должен конфликтовать с предыдущим, и наоборот. Может быть, у кого-то есть идеи по этому поводу? Блокировка записей в самой базе не подходит, ибо к ней обращается много процессов, в т.ч. для записи. Создание новых вспомогательных полей невозможно.
Мне самому пока что представляется только один способ - в тот момент, когда запускается скрипт A, он создает некий системный файл, в который записывается дата последней обрабатываемой им записи (или же ID) - X. Когда запускается скрипт B, он считывает-запоминает данную дату и несмотря на то, что выбранные им записи частично будут "накладываться" на те, что были выбраны A, он будет обрабатывать только те записи, которые были созданы позже времени X. Соответственно, скрипт B также вносит в файл свою дату X.
Буду признателен за любые размышления по поводу, заранее спасибо!
Здравствуйте!
Существует довольно простенькая база данных, например, с такими полями:
- уникальный идентификатор
- заголовок, по умолчанию пустой
- поле даты создания записи
Существует скрипт, который запускается каждый определенный промежуток времени (например, раз в пять минут), обходит базу по тем полям, у которых пустой title (они были занесены в нее другим сторонним скриптом) и заполняет title при помощи UPDATE на основе имеющейся функции.
Проблема может возникнуть, как можно догадаться, в том, что пока один скрипт выполняется, в этот момент может запуститься другой. И он начинает обрабатывать также те поля, которые "на себя взял" предыдущий процесс. Обработка происходит стандартнтым обращением к базе (в моем случае - pg_query... pg_fetch_array), и даже если вставить в цикл обработки SELECT условие проверки на пустой title, оно не помогает, т.к. запрос, судя по всему, и все обрабатываемые записи на его момент сохраняются в памяти.
Интересует возможность обхода этой ошибки. Т.е. последний запущенный процесс не должен конфликтовать с предыдущим, и наоборот. Может быть, у кого-то есть идеи по этому поводу? Блокировка записей в самой базе не подходит, ибо к ней обращается много процессов, в т.ч. для записи. Создание новых вспомогательных полей невозможно.
Мне самому пока что представляется только один способ - в тот момент, когда запускается скрипт A, он создает некий системный файл, в который записывается дата последней обрабатываемой им записи (или же ID) - X. Когда запускается скрипт B, он считывает-запоминает данную дату и несмотря на то, что выбранные им записи частично будут "накладываться" на те, что были выбраны A, он будет обрабатывать только те записи, которые были созданы позже времени X. Соответственно, скрипт B также вносит в файл свою дату X.
Буду признателен за любые размышления по поводу, заранее спасибо!