Mysql 创建或更新锁

标签 mysql stored-procedures locking

我有一个模拟创建或更新的存储过程。

这是我的算法:

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/

相关文章:

C# 打不开连接

sql - MySQL foreach 替代过程

mysql同步查询插入

php - 从 "mysql_query"的结果中计算行数

java - 当我运行程序时,JPA 不会在 MySQL 中创建表

mysql - Amazon Web Service RDS 连接失败

sql - 避免用户向 SQL Server 中的存储过程提供空值

sql-server - 从具有多个结果集的存储过程中检索数据

与对象锁混淆的java同步

java - 线程在从空 DataInputStream 读取 UTF 时卡住