1

ジョブを取得して実行するために同じ mysql クエリを実行する複数のソースがあります (ソースは異なる php スクリプトです)。過去との距離が最も長いジョブを取得したいので、次のクエリを使用します。

SELECT * FROM jobs ORDER BY last_done ASC

ここで私の問題は、各ソースが一意の結果を取得する必要があることです。つまり、1 つのソースがjob1このジョブを取得した場合、last_done への更新を取得する必要があるため、再びテーブルの一番下にあり、秒のソースがクエリを実行する場合は取得しないでくださいjob1。代わりに取得する必要がjob2あります。

選択後に別々に更新すると、2つのソースがほぼ同時に呼び出され、同じジョブが取得されることがあるという問題があります。

近くでクエリを実行している 2 つのソースが同じジョブを取得しないようにするにはどうすればよいですか?

4

2 に答える 2

1

1 - SET TRANSACTION ISOLATION LEVEL SERIALIZABLE 2 - 単一のトランザクションで選択と更新を実行します。

注: SERIALIZABLE 分離レベルはやり過ぎかもしれません。詳細については、 https://en.wikipedia.org/wiki/Isolation_(database_systems)およびhttp://msdn.microsoft.com/en-us/library/ms173763.aspxを確認してください。

于 2013-07-07T16:29:52.477 に答える
0

これにはトランザクションを使用する必要があります。ある実装では、レコードをフェッチして別のテーブルに置くことができますjob_in_progress

次回は にないジョブを選択できますjob_in_progress

このトランザクションをシリアライズ可能な分離レベルで実行する

于 2013-07-07T16:31:47.000 に答える