同期クローンまたは単純な分散トランザクション(PHP)

長い間、私はこのすべてが必要な理由を言葉にしようとしましたが、それから私はこの考えを捨てました。 誰が気にします-私はコメントで答えます。 だから要点:

同様の機能を持つ同様のデータベースを持つ複数のWebサイトがあります(たとえば、同じ製品を販売する店舗(1人の所有者))。

必要性:新しい製品をすべての店舗に同時に追加します。 または、少なくとも1つでエラーが発生した場合はどこにも追加しないでください。 非常に単純な場合、特定のテーブルのレコードIDはすべてのサイトで一致する必要があります。 たとえば、product_id。 繰り返しますが、タスクを単純化しました。実際、すべてがはるかに複雑です。


各サイトにProductクラスがあり、対応するメソッドがあるとします

class Product
{
...
public static function createNewProduct($productName)
{
if ( self::exists($productName) ) {
throw new Exception('product exists in database');
//
// , « - »
}

$db->execute(
'INSERT INTO products
SET name={$productName}');
$newId = $db->lastInsertId;

return new self($newId);
}
...
}


つまり、各サイトで次のように新しいエントリが作成されます。

<?php
$product = Product::createNewProduct('new product name');


いずれかのサイトで例外が発生する可能性があるため、すべてのクローンサイトでこのコードを実行する必要があります。その場合、どのサイトにもレコードを追加しないでください。

例:

beginTransaction();

try {
$product = Product::crateateNewProduct('new product name);
commitTransaction();
} catch (Exception $e) {
rollbackTransaction();

throw new Exception('clone-wide code execution failure');
}


これがどのように見えるべきかです! 問題は次のとおりです。

  1. すべてのクローンサイトでまったく同じコードを同時に実行する必要があります。
  2. commitTransaction()関数は、すべてのクローンサイトが「ゴーアヘッド」を行うまで「true」コミットを行うべきではありません。
  3. 少なくとも1つのクローンでrollbackTransaction()関数に入ると、すべてのサイトでエラーが発生しなくてもすべてのサイトが「ロールバック」されるように、すべてのクローンで例外をスローする必要があります。


これを行うには:

  1. 「分散トランザクション」をサポートする機能に、トランザクションのステータスを通知させます。 たとえば、 example1.com / transaction / status.txtのように、外部からアクセス可能な行BEGIN / READY / COMMITED / ROLLBACKを持つファイル
  2. MySQLトランザクションがすべての既知のクローンサイトを「実行」することを確認する前にcommitTransaction()関数を作成し、「すべてが正常」であることを確認し、この場合のみCOMMITを実行します。 そうしないと、例外がスローされます。
  3. rollbackTransaction()関数がstatus.txtファイルにステータスを保存するようにして、他のクローンサイトがこれを見つけて「ロールバック」できるようにします


写真はこれを示しています。

画像

同様に、製品のステータスの変更やカードの編集など、任意のコードを実行できます。 4codeコードを渡す方法を見つける必要があるだけです。これは「すべてのクローンで同期的に」実行され、eval($コード)を呼び出す必要があります。

すべてのサイトでコードを(多かれ少なかれ)同時に実行させる方法にはまだ小さな問題があります。 nohupでこれを解決しましたが、他の方法もあると思います。

これらすべてをhabrachelovekamiと議論したいと思います。

Source: https://habr.com/ru/post/J54414/


All Articles