1

file1.php2つのファイルと。があるとしましょうfile2.php

file1.phpには次のクエリがあります。

-query 1
-query 2
-query 3

file2.phpには次のクエリがあります。

-query 4
-query 5
-query 6

1人の訪問者が最初のスクリプトを実行し、別の訪問者が2番目のスクリプトをまったく同時に実行するとします。

私の質問は、MySQLが1つの接続を受け取り、最初のスクリプトのすべてのクエリを実行している間、2番目の接続をキューに保持してから、2番目の接続に移動するかどうかです。

MySQLによって処理されるクエリの順序は1,2,3,4,5,6(または4,5,6,1,2,3)ですか、それとも任意の順序にすることができますか?

別の接続に移動する前に、MySQLが1つの接続のすべてのクエリを実行するようにするにはどうすればよいですか?

私はデータの整合性に関心があります。たとえば、同じアカウントを共有する2人のユーザーによるアカウント残高。同じ値が表示される場合がありますが、両方が同時にクエリを送信すると、予期しない結果が生じる可能性があります。

4

4 に答える 4

3

データベースは、複数の接続からのクエリを並行して受け入れることができます。同時にでも、任意の順序でクエリを実行できます。分離レベルは、並列実行が結果にどの程度影響するかを定義します。

トランザクションを使用しない場合、クエリは並列で実行できます。最も強力な分離レベルでは、クエリが並列で実行されなかった場合と同じ結果を返すことのみが保証されますが、任意の順序で実行できます(各接続内でソートされている限り)

トランザクションを使用する場合、データベースはさらに多くのことを保証できます。

最強の分離レベルはです。これは、 2つのトランザクションが並行して実行されていないserializableのように結果が得られることを意味しますが、パフォーマンスは低下します。

最も弱い分離レベルは、トランザクションをまったく使用しない場合と同じです。なんでも起こる可能性がある。

データの一貫性を確保したい場合は、トランザクションを使用してください。

START TRANSACTION;
...
COMMIT;

デフォルトの分離レベルはです。これは、通常のトランザクション外で発生read-commitedする場合とほぼ同じです。トランザクション内のすべてのSELECTに使用すると、次のようになります。serializableSELECTSELECT FOR UPDATEserializable

参照:http ://dev.mysql.com/doc/refman/5.0/en/set-transaction.html#isolevel_repeatable-read

于 2012-11-10T20:59:47.897 に答える
2

一般に、実行の順序を予測または制御することはできません。1、2、3、4、5、6、4、5、6、1、2、3、または1、4、2、5、3、6のいずれかになります。またはそれらの任意の組み合わせ。

MySQLは複数の接続からのクエリを並行して実行し、サーバーのパフォーマンスはすべてのクライアント(この場合は2つ)で共有されます。これを心配したり変更したりする理由はないと思います-MySQLは、複数の接続を提供できるように、これを念頭に置いて作成されました。

パフォーマンスの問題がある場合は、通常、インデックスを追加するか、データベーススキーマを変更することで解決できます(テーブルの正規化や非正規化など)。

于 2012-11-10T20:54:16.337 に答える
1
  1. 操作をトランザクションとして行い、自動コミットをfalseに設定します
  2. デッドロックを防ぐため、同じ順序ですべてのテーブルにアクセスします。
于 2012-11-10T21:06:52.730 に答える
1

max_connections1に制限してもかまいませんtoo many connectionsが、他の接続ではエラーが発生します。同時実行を制限しても意味がありません。

于 2012-11-10T20:58:35.403 に答える