【发布时间】:2010-12-24 02:19:05
【问题描述】:
我有 php 脚本,我必须在 linux 和 Windows 服务器上运行。 我想使用相同的脚本而不对这两个环境进行任何修改。
这些脚本将使用 cron(在 linux 上)和 windows 调度程序(或其他,我现在不关心)为我的 Windows 环境调度。
但是,其中一些脚本可能需要几分钟才能完成。我只是想阻止调度程序(cron 或 windows 的)在上次启动之前启动相同的脚本。
我不知道该怎么做.. 我想确保如果在执行过程中出现问题,“锁”会被释放,所以下次它会在没有人为干预的情况下再次启动。
也许在一个虚拟文件上放一个羊群就可以了,但我不知道该怎么做。
我在这些服务器上也有一个 MySQL 数据库。我想也许可以在数据库端使用锁。
1- Start a transaction
2- Insert script name in a table.
3- execution of the script.
4- If successful then delete the row and commit the transaction or simply rollback;
如果脚本名称在表中,我可以阻止它运行。 如果脚本执行失败,那么Mysql会自动回滚事务,这样下次调用脚本时该行就不会出现了。
但是,在事务中,有没有办法让其他连接看到未提交的数据?如果是,怎么做?
如果不可能使用回滚的东西,我也想过在行上使用锁..
1- Insert script name in a table if it doesn't already exists.
2- Start a transaction.
2- Select * from Table where script_name FOR UPDATE.
3- execution of the script.
4- If successful then release the lock (rollback or commit).
但我的主要问题是 Mysql。选择 FOR UPDATE 挂起,直到前一个锁被释放或 50 秒超时(innodb_lock_wait_timeout 变量)已过。我希望 Mysql 在不影响整个数据库的情况下当场告诉我我的行被锁定。那是因为 innodb_lock_wait_timeout 变量是全局变量(不是会话变量)。 是否有另一个变量可以模仿 Oracle 中可用的 NO_WAIT 子句?
或者我应该让脚本挂起 50 秒没有任何问题?
什么是最好的方法,因为我是一个 php 新手,我不想在服务器上造成任何问题。
也许我还有另一个我没有看到的选项..
【问题讨论】:
-
您的脚本是否使用了 MySQL 数据库?还是其他一些资源?
-
有些可以,有些不可以...这些脚本是可配置的,我想在所有这些脚本将继承的基类上实现锁定。所以使用数据库是可能的。