Мьютексы в Perl и MySQL - PullRequest
       2

Мьютексы в Perl и MySQL

1 голос
/ 01 марта 2012

Я пытаюсь убедиться, что только один экземпляр сценария Perl может работать одновременно.Сценарий выполняет какое-то действие db_operation в зависимости от переданных параметров. Сценарий не обязательно находится в одном месте или на одном компьютере, и, возможно, в нескольких ОС.Хотя файловая система автоматически монтируется на разных компьютерах.

Моим первым подходом было просто создать файл .lock и сделать следующее:

use warnings;
use strict;
use Fcntl qw(:DEFAULT :flock);
...
open(FILE,">>",$lockFilePath);
flock(FILE,LOCK_EX) or die("Could not lock ");
do_something();
flock(FILE,LOCK_UN) or die("Could not unlock ");
close(FILE);

, но я продолжаю получать следующие ошибки:

Bareword "LOCK_EX" not allowed while "strict subs" in use
Bareword "LOCK_UN" not allowed while "strict subs" in use

Поэтому я ищу другой способ решения проблемы.Сама блокировка БД также нецелесообразна, поскольку БД может использоваться другими сценариями (что приемлемо), я просто пытаюсь предотвратить запуск этого сценария.А блокировка таблицы для записи нецелесообразна, поскольку мой сценарий не знает, для какой таблицы выполняется операция, он просто запускает другой сценарий perl, предоставляемый в качестве параметра.

Я думаю добавить таблицу вdb, с одним значением, и использовать его в качестве мьютекса, но я не знаю, насколько это практично / надежно (в моей голове много красных флажков).У меня есть DBI-соединение с БД, которое использует этот скрипт.

Спасибо

Ответы [ 2 ]

5 голосов
/ 01 марта 2012

Ошибка Bareword звучит так, будто вы что-то сделали в этом "...", чтобы запутать Perl в отношении импортированных констант Fcntl.Нет ничего плохого в том, чтобы использовать такие константы.Вы можете попробовать что-то вроде LOCK_UN(), чтобы увидеть, какую ошибку вы получаете.

Если вы используете MySQL, вы можете использовать механизм GET_LOCK() и RELEASE_LOCK().Это работает достаточно хорошо для таких случаев:

SELECT GET_LOCK("script_lock");

, а затем, когда вы закончите:

SELECT RELEASE_LOCK("script_lock");

Подробнее см. http://dev.mysql.com/doc/refman/4.1/en/miscellaneous-functions.html.

1 голос
/ 01 марта 2012

Вы можете избежать блокировки файла;насколько я помню, это ненадежно ненадежные файловые системы.Лучше всего использовать только наличие самого файла для индикатора того, что скрипт уже запущен (похоже на файл PID UNIX). Конечно, это не будет на 100% надежно, но должно работать достаточно надежно с очень низкими издержкамипри условии, что скрипт не вызывается непрерывно.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...