2つのデータベース間でデータを同期するスクリプトを使用しています(ホストされているドメインにローカル)。誰かがCMSからログアウトしたときに同期が行われるようにしました。不幸にも、2回ログアウトして同期スクリプトが2回実行されるような状況が発生しています。私が変更しようとしているのはシステムの一部ではありませんが、すでに実行中の場合、そのスクリプト(sync.php)が実行されないようにする簡単な方法を期待していました。PHPスクリプトが同時に実行されないようにするにはどうすればよいですか?
私は、テストスクリプトを思い付いています
$db = new DB_Mysql();
if ($db->transactionBegun() == "0")
{
$_Continue = true;
$_Continue = $_Continue && $db->squery("START TRANSACTION");
$_Continue = $_Continue && $db->squery("SET @TransactionBegun = true");
sleep(10);
$_Continue = $_Continue && $db->squery("INSERT INTO tbConfiguration VALUES(NOW(), NOW())");
$_Continue = $_Continue && $db->squery("SET @TransactionBegun = false");
if ($_Continue)
{
$db->query("COMMIT");
} else {
$db->query("ROLLBACK");
}
}
transactionBegun方法は、から構成されています。いくつかの奇妙なエイリアンの理由
function transactionBegun()
{
$_ResultSet = $this->query("SELECT @TransactionBegun AS TransactionBegun")->fetch_all(true);
return $_ResultSet[ 'TransactionBegun' ];
}
、私は同じ時間に二回(スクリプトを実行することができます)、両方のエントリーが行われます。
編集: 私はmysql_pconnect()
を使用して、サーバーがWindowsマシン上でホストされていることだということを言及するのを忘れてしまいました。システム全体は、タブレットPCを使用する現金自動預け払い機です。サーバーにアクセスする唯一のクライアントは "localhost"です。
@Variablesは接続上にのみ存在し、グローバルではありません。複数のクライアントがテーブル/行と同時に対話するのを防ぐには、ロックを使用する必要があります。 –
私のライブラリがmysql_pconnect()を使用するように指定するのを忘れました。 – Cybrix