这是我的查询:
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)
使用FOR UPDATE
语句,您将锁定所有选定的许可证,直到执行更新,因此您可以确保这些记录不会出现并发问题。
我能看到的唯一问题是,如果您的查询需要大量时间来执行(您希望在每次查询时处理多少个许可证?)而其他查询需要licenses
(甚至读取查询都被锁定)同时,你的系统将会变慢。