私はプラグインに取り組んでいます。 DBのカスタムテーブルを読み書きするAPIを作成しました。このAPIはN個のクライアントから同時に呼び出される可能性があります(そして実際には起こります)。この場合、問題が発生することに気付きました。具体例を挙げます。
if (is_null($wpdb->get_var("SELECT column FROM my_table_name WHERE condition"))) {
// branch 1
}
else {
// branch 2
}
ブランチ1では、DBから取得した変数はNULL
であると無実に想定していますが、別のスレッドによって変更されているため、これはもはや真実ではありません。少なくともブランチ1の終わりまで、この状態は変わっていないという保証が必要です。
この問題を解決するためのWordPressの方法は何ですか?セマフォ、ファイルロック、MySQL LOCK TABLE?それとももっと良い解決策はありますか?私は長い間Web上で検索しましたが、決定的なものを見つけることができませんでした。このような場合、WordPress自体(またはメインプラグイン)はどのように動作しますか?
あなたのプラグインは他の人による使用を意図していますか、それともあなたがコントロールするサーバ上でのみ使用されるのでしょうか?後者の場合は、それからあなたが望むものを達成するためのいくつかの方法があるかもしれません。例えば、 同期拡張 です。それで、フラグを設定するためにミューテックスまたはセマフォを使うことができたと思います、そしてそれをあなたはそれからあなたの読み書き機能で使うことができました。
すでにmemcacheが利用可能な場合は、新しいエクステンションをインストールする必要なしに、同じことをするための軽量な方法かもしれません。
それに失敗すると、dbテーブルロックを使用できるようになるかもしれませんが、それは本当にのように大げさなようで、データベースのパフォーマンスへの影響を心配しています。