【问题标题】:Mysql how to do this without lockingMysql如何在不锁定的情况下做到这一点
【发布时间】:2015-12-08 05:49:26
【问题描述】:

我想查询一张表,看看是否存在'A'类型的行。 所以我使用这个sql:

SELECT EXISTS(select * from %T where type = 'A');

然后我需要将另一个表的列值更新为上述结果。为了防止在更新期间发生“A”类型的插入,我正在考虑使用锁。但是锁很贵,有没有其他不加锁的替代方法?

如果我们必须使用锁,我在想如果表已经有类型A,在更新期间不需要锁定插入,因为结果仍然是1。只有在没有类型A的行时才阻止插入。该怎么做?

谢谢!

【问题讨论】:

  • 你试过SQL中的“事务”吗?我认为你可以使用它。此链接将帮助您“dev.mysql.com/doc/refman/5.7/en/commit.html
  • 你不能只更新 another_table SET field=(SELECT EXISTS...) 吗?
  • 当然,任何锁都比更新更便宜。你的实际目标是什么?您可能想要的而不是使用显式锁定是start transaction ... commit

标签: mysql sql database-performance sqlperformance


【解决方案1】:

由于您想在存在“A”类型时更新表,通常我建议您在插入或删除一行后立即进行更新或检查。

或者你可以这样做:

UPDATE table1 t1
LEFT JOIN table2 t2 ON t1.type = t2.type
SET t1.column1 = 1
WHERE t2.type IS NOT NULL

UPDATE table1 t1
SET t1.column1 = 1
WHERE EXISTS (
    SELECT ...
    FROM table2
    WHERE type = 'A'
);

请提供更多详细信息,例如您的餐桌是什么样的以及您到底想做什么,以便我们进一步讨论。

【讨论】:

  • 谢谢!如果我使用 UPDATE table1 t1 SET t1.column1 = 1 WHERE EXISTS ( SELECT ... FROM table2 WHERE type = 'A' );更新期间是否允许将 type='A' 插入 table2?
猜你喜欢
  • 2021-09-24
  • 1970-01-01
  • 2020-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多