我有我的Linux脚本以及Windows服务器上运行的PHP脚本。 我想使用相同的脚本,而不对这两种环境进行任何修改。如何防止脚本的多个实例?
这些脚本将与我的Windows环境计划与cron(在Linux上)和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数据库吗?或者其他一些资源? – VolkerK
其中有些是有的,有些则不是......这些脚本是可配置的,我希望在所有这些脚本都会继承的基类上实现锁定。所以可以使用数据库。 – Pmax