Perl和MySQL中的Muetexes

Sma*_*elf 1 mysql unix linux perl locking

我试图确保只有一个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);
Run Code Online (Sandbox Code Playgroud)

但我不断收到以下错误:

Bareword "LOCK_EX" not allowed while "strict subs" in use
Bareword "LOCK_UN" not allowed while "strict subs" in use
Run Code Online (Sandbox Code Playgroud)

所以我正在寻找另一种解决问题的方法.锁定数据库本身也不实用,因为db可以被其他脚本使用(这是可以接受的),我只是试图阻止这个脚本运行.锁定表进行写入是不切实际的,因为我的脚本不知道操作正在发生什么表,它只是启动另一个作为参数提供的perl脚本.

我想在数据库中添加一个表,只有一个值,并将其用作muetex,但我不知道它是多么实用/可靠(我脑子里有很多红旗).我有一个DBI连接到这个脚本使用的数据库.

谢谢

zos*_*tay 5

Bareword你得到的错误听起来就像你在"......"中做了一些事情来混淆Perl关于导入的Fcntl常量.使用这样的常量没有错.您可以尝试一些类似于LOCK_UN()查看错误的内容.

如果您使用的是MySQL,则可以使用GET_LOCK()RELEASE_LOCK()机制.它适用于这样的情况:

SELECT GET_LOCK("script_lock");
Run Code Online (Sandbox Code Playgroud)

然后当你完成:

SELECT RELEASE_LOCK("script_lock");
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅http://dev.mysql.com/doc/refman/4.1/en/miscellaneous-functions.html.