【问题标题】:Mysql create or update lockMysql 创建或更新锁
【发布时间】:2014-08-11 17:29:13
【问题描述】:

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

这是我的算法:

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。行锁可以帮助我吗?出于性能原因,锁定整个表是不可接受的。

【问题讨论】:

  • 主键永远不能为空。
  • 你需要使用一个事务或者锁表围绕这两个语句。
  • 我的“主键”由 3 列组成。其中之一可能为空。这是正确的。我无法更改表定义...
  • @Barmar:性能很重要。 LOCK TABLE t AS myalias READ 之类的东西;或开始交易; / 犯罪;会这样做吗?

标签: mysql stored-procedures locking


【解决方案1】:

将事务与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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-23
    • 1970-01-01
    • 2013-08-20
    • 2020-10-31
    • 1970-01-01
    • 1970-01-01
    • 2012-06-09
    相关资源
    最近更新 更多