gpt4 book ai didi

mysql - perl 和 MySQL 中的互斥量

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:24:57 24 4
gpt4 key购买 nike

我试图确保一次只能运行一个 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 脚本。

我正在考虑向数据库添加一个表,只有一个值,并将其用作互斥锁,但我不知道这有多实用/可靠(我脑子里升起了很多危险信号).我与此脚本使用的数据库有 DBI 连接。

谢谢

最佳答案

您收到的 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了解详情。

关于mysql - perl 和 MySQL 中的互斥量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9518328/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com