У меня есть crons, который запускает скрипт каждые 3 минуты, скрипт содержит функцию:
try begin transaction loop //parse large xml data //send data to database endloop commit endtry catch rollback endcatch
Теперь вставка данных длительная, что занимает около 3-6 минут, а cron – каждые 3 минуты, поэтому иногда происходит конфликт процессов. Я вижу, когда я добавляю внутренний цикл фиксации, что приоритет имеет новый процесс, могу ли я как-то сказать, что новая транзакция ждет до того, как транзакция зафиксирует?
Я бы попробовал Keep It Simple S ….. и использовал простой процесс блокировки файлов, подобный этому, в верхней части существующего скрипта cron.
$fp = fopen("/tmp/my_cron_lock.txt", "r+"); if ( ! flock($fp, LOCK_EX)) { // other cron is overrunning so // I'll get restarted in 3 mins // so I will let other job finish fclose($fp); exit; } // existing script // free the lock, // although this will happen automatically when script terminates fclose($fp); ?>
Вы можете хранить некоторые блокировки где-то постоянными, как правило, это делается в некотором файле блокировки в файловой системе:
Сначала процесс проверяет, существует ли файл. Если это так, он сразу же выходит. Если файл блокировки не существует, он создает сам файл блокировки и записывает в него свой собственный идентификатор процесса. При завершении он снова проверяет, является ли это все еще свой собственный файл блокировки (по идентификатору процесса) и удаляет его, если все в порядке.
Таким образом, вы можете запускать триггерный скрипт (задание cron) каждую минуту без какого-либо риска.
То же самое можно сделать и на уровне базы данных или даже на уровне таблицы. Однако это может быть менее надежным в зависимости от ситуации, поскольку он явно не работает, если есть проблема с подключением к базе данных. Чем меньше слоев задействовано, тем более надежными. И как всегда: вы должны сами решить, какой подход лучше всего. Но в целом: блокировка – это ответ.