5

PHP スクリプトと MySQL の動作に興味がありましたか? スクリプトは基本的に 2 つの SQL クエリです。

最初の SELECT は、ID によって決定される特定の行の列から数値を取得します。

次に、数値が正の場合、2 番目は特定の量を減算して列を更新します。

明らかに、これはトランザクション、ロック、ミューテックスなどを使用する典型的なケースです。

私の質問は次 のとおりです。Web サイトでは、2 人以上のユーザーが同じ行に対して同時にスクリプトを呼び出すことは完全に可能です。トランザクションやロックテーブルを使用しない場合、PHP はこれをどのように処理しますか? これらは 2 つのクエリ/関数呼び出しですが、1 つのスクリプト内にあります。スクリプト全体が対応するユーザーに戻って別のユーザーに対して再度実行するのを待ちますか、または疑似並列処理のためにそれらが異なるクエリであるため、同じスクリプトを呼び出す複数のユーザーで最初のクエリを実行し、次に別のセットに対して2番目のクエリを実行する可能性があります。 .

基本的に私は、トランザクションまたはロックを使用するのに十分な権限がなく、ミューテックスを回避できるかどうかを知りたい場合に何かを行っているため、質問しています(基本的に呼び出し元のための新しいテーブルという言葉についてはわかりません;上記のスクリプトを呼び出す前に、その前に新しいスクリプトを呼び出します。その前に、テーブルのブール列を true にして、元のスクリプトが終了するまで他の人ができないようにし、その後、次のスクリプトが実行できるように false に戻します。 )

編集: 更新の選択について、その権限が上記に含まれているかどうかはわかりません。私の質問に答えてくれる人を見つけるのは難しく、私は彼を探していました...

4

2 に答える 2

1

更新はできるが、テーブルをロックできないのは非常に奇妙です (更新は、一部のエンジンではテーブルをロックし、他のエンジンでは行をロックします)。しかし、本当にそのようにロックできない場合は、get_lock functionを使用できます。ミューテックスのように機能します。

PS assign( ) のみで update を使用している場合、set a=10一部のデータが失われる可能性があります。fields( ) で ref を使用して割り当てを使用している場合、set a=10+aそれは決して起こりません。

于 2013-02-22T13:21:07.340 に答える
0

1回の電話でそれを行うことはできませんか?

UPDATE T1
    SET T1.COLUMN = T2.COLUMN - 4
    FROM TABLE1 AS T1
    INNER JOIN TABLE2 AS T2
        ON T1.COLUMN = T2.COLUMN
    WHERE T2.COLUMN = ID
    AND T2.COLUMN > 0
于 2013-02-22T13:23:05.107 に答える