MySQL中的SELECT FOR UPDATE有多安全

时间:2016-05-26 08:11:27

标签: mysql transactions

这是我的查询:

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);

如果我要面对高并发性,那么上面的查询是否是线程安全的?我的意思是我不想分配已经分配给另一个的记录。

1 个答案:

答案 0 :(得分:1)

使用FOR UPDATE语句,您将锁定所有选定的许可证,直到执行更新,因此您可以确保这些记录不会出现并发问题。

我能看到的唯一问题是,如果您的查询需要大量时间来执行(您希望在每次查询时处理多少个许可证?)而其他查询需要licenses(甚至读取查询都被锁定)同时,你的系统将会变慢。