sql >> データベース >  >> RDS >> Mysql

MySQLはクエリをキューに入れますか?

    クエリは常に並列で実行されるわけではありません

    データベースエンジンによって異なります。 MyISAMを使用すると、ほぼすべてのクエリがテーブルレベルのロックを取得します。これは、クエリがキューとして順番に実行されることを意味します。他のほとんどのエンジンでは、並行して実行される可能性があります。

    echo_meによると、nothing happens at the exact same time and a CPU does not do everything at once

    それは正確には真実ではありません。 DBMSは、複数のCPUと複数のネットワークインターフェイスを備えたマシンで実行される可能性があります。 とても 2つのクエリが同時に到着する可能性は低いですが、不可能ではありません。したがって、ペアリング/実行遷移が(実行の-必ずしも同じ軽量プロセスではなく)単一のスレッドとしてのみ実行されるようにするミューテックスがあります。

    >

    同時DMLを解決するには、2つのアプローチがあります。トランザクションを使用する(各ユーザーがデータベースのクローンを効果的に取得する)方法と、クエリが完了すると、DBMSが変更を調整しようとする方法です。調整が失敗した場合、DBMSは次のいずれかをロールバックします。クエリを実行し、失敗したと報告します。もう1つのアプローチは、行レベルのロックを使用することです。DBMSは、クエリによって更新される行を識別し、更新用に予約済みとしてマークします(他のユーザーは各行の元のバージョンを読み取ることができますが、データを更新しようとすると、行が再び使用可能になるまでブロックされます。

    問題は、2つのmysqlクライアントがあり、それぞれが1つの在庫アイテムが残っているという事実を取得していることです。これは、(PHPについて言及しているので)在庫レベルが後続の在庫調整とは異なるDBMSセッションで取得された可能性があるという事実によってさらに複雑になります。つまり、HTTP要求を超えるトランザクションを持つことはできません。したがって、単一のトランザクション内でDBMSの外部で維持されている事実を再検証する必要があります。

    楽観的ロックにより、疑似トランザクション制御メカニズムを作成できます-変更しようとしているレコードにタイムスタンプとユーザー識別子でフラグを立てます(PHPではPHPセッションIDが適切です)-変更する場合は、他の何かが変更した場合、コードは以前に取得したデータが無効であることを認識します。ただし、これは他の合併症につながる可能性があります。



    1. Mac上のQt用のMySQL

    2. 必要な場合にのみPDOに自動接続

    3. jspページのドロップダウンリストから選択したオプションを送信してmysqlクエリを実行する方法

    4. mysqlクエリのパフォーマンスを確認する方法は?