1

複数のユーザーが相互にやり取りし、共有データの読み取り/決定/変更を行う webapp を作成しています。

トランザクションはアトミックであると読みましたが、これが必要です。ただし、PHPでどのように機能するかはわかりませんPDO::beginTransaction()

つまり、1 つのトランザクションが一部のデータを編集し、他のすべてのトランザクションもそのデータを変更/読み取り、最初のトランザクションが終了するまで待機する必要があるかのように、アトミックを意味します。2 つのスクリプトで値を読み取り、古い値をインクリメントし、実質的に 1 つのインクリメントのみを保存するのは望ましくありません。2 番目のスクリプトは、最初のスクリプトが終了するまで待機する必要があります。

私が見たほとんどすべての例では、クエリが連続して使用されています (例PHP + MySQL トランザクションの例)。私がやっていることの多くは

  • クエリとフェッチ
  • 同じトランザクションの一部として、そのデータをチェックし、それに基づいて行動する

  1. クエリ間に PHP コードがある場合、トランザクションはアトミックに動作しますか?
  2. 取引外で明細書を作成する必要があるのは承知していますが、取引内で作成してもよろしいですか?基本的に、私は PHP アクティビティがトランザクションの原子性を台無しにすることを心配しています。

以下に例を示します (これは以前の値を確認する必要はありません)。メールをシリアル化された配列として保存する非常に基本的な受信トレイ システムがあります (より良い推奨事項がある場合はお知らせください)。そのため、クエリを実行し、新しいメッセージを追加して保存します。期待どおりに機能しますか?

$getMail = $con->prepare('SELECT messages FROM inboxes WHERE id=?');
$storeMail = $con->prepare('UPDATE inboxes SET messages=? WHERE id=?');
$con->beginTransaction();
$getMail->execute(array($recipientID));
$result = $getMail->fetch();
$result = unserialize($result[0]);
$result[] = $msg;
$storeMail->execute(array(serialize($result), $recipientID));
$con->commit();
4

1 に答える 1

10

トランザクションは、同じデータを使用しようとする他のデータベース接続に関してのみアトミックです。つまり、他の接続は、トランザクションによって行われた変更がないか、すべての変更を認識します。「アトミック」は、他のデータベース接続が更新されたデータと更新されていないデータの中間状態を認識しないことを意味します。

クエリ間の PHP コードは原子性を損なうことはなく、ステートメントをどこで準備するかは問題ではありません。

于 2012-06-21T06:33:37.730 に答える