我有一个模拟创建或更新的存储过程。
这是我的算法:
SELECT Id INT rId FROM MY_TABLE WHERE UNIQUE_FIELD = XXX LIMIT 1;
IF (rId is not null) THEN
UPDATE ELSE INSERT
问题是我得到了重复项。我怎样才能防止这些重复?我无法添加 UNIQUE INDEX,因为某些字段可以为 NULL。
谢谢。
编辑:我正在使用 InnoDB。行锁可以帮助我吗?出于性能原因,锁定整个表是 Not Acceptable 。
最佳答案
在 SELECT
中使用事务和 FOR UPDATE
子句。这只会锁定那一行,并且不应阻止使用表中其他行的事务。
START TRANSACTION;
SELECT id as rId FROM my_table
WHERE unique_field = XXX LIMIT 1
FOR UPDATE;
If (rId IS NOT NULL) THEN
UPDATE ...
ELSE
INSERT ...
END;
COMMIT;
关于Mysql 创建或更新锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25249043/