2016-05-26 7 views
1

でUPDATE FOR SELECTどのように安全ですが、私のクエリです:ここではMySQLの

SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED; 
START TRANSACTION; 
DROP TEMPORARY TABLE IF EXISTS taken; 

CREATE TEMPORARY Table taken(
    id int, 
    invoice_id int 
); 

INSERT INTO taken(id, invoice_id) 
SELECT id, $invoice_id FROM `licenses` l 
WHERE l.`status` = 0 AND `type` = $type 
LIMIT $serial_count 
FOR UPDATE; 

UPDATE `licenses` SET `status` = 1 
WHERE id IN (SELECT id FROM taken); 

私は高い同時実行に直面するつもりだ場合は、スレッドセーフで上記のクエリのですか?私はすでに別のレコードに割り当てられているレコードを割り当てたくないということです。

+0

なぜ更新用に別のテーブルを作成する必要があるのですか?1つのクエリでテーブルを更新するだけのことはできませんか? – gbalduzzi

+0

@gbalduzzi私は更新したレコードを知る必要があります。 –

+0

「安全」をどのように定量化しますか? – Strawberry

答えて

1

FOR UPDATEステートメントでは、更新を実行するまで選択したすべてのライセンスをロックしているため、これらのレコードに並行性の問題がないことを確認できます。

唯一の問題は、クエリの実行に多くの時間がかかる場合(各クエリでいくつのライセンスを処理すると思われますか?)、他のクエリではlicensesが必要です同時に、あなたのシステムは遅くなります。

+0

それらのものはあまりなく、わずか1〜5のレコードであり、そのテーブルには何も読み込まれていません。 –

+0

その場合、パフォーマンスのオーバーヘッドは非常に低くなります。あなたのソリューションは安全だと思います – gbalduzzi