首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL行锁的缺点

MySQL行锁的缺点
EN

Stack Overflow用户
提问于 2012-09-26 03:33:13
回答 1查看 1K关注 0票数 5

我使用MySQL中的行锁定(事务)来创建作业队列。使用的引擎是InnoDB。

SQL查询

代码语言:javascript
复制
START TRANSACTION;
SELECT * 
FROM mytable 
WHERE status IS NULL 
ORDER BY timestamp DESC LIMIT 1 
FOR UPDATE;
UPDATE mytable SET status = 1;
COMMIT;

根据这个网页

The problem with SELECT FOR UPDATE is that it usually creates a single synchronization point for all of the worker processes, and you see a lot of processes waiting for the locks to be released with COMMIT.

问题:是否意味着当第一个查询被执行时,这需要一段时间才能完成事务,当第二个类似的查询在提交第一个事务之前发生时,它必须等待它在执行查询之前完成吗?如果这是真的,那么我不明白为什么单个行的行锁定(我假设)会影响下一个不需要读取锁定行的事务查询?

此外,是否可以通过执行UPDATE而不是事务来解决这个问题(仍然可以实现作业队列的行锁定效果)?

代码语言:javascript
复制
UPDATE mytable SET status = 1
WHERE status IS NULL
ORDER BY timestamp DESC
LIMIT 1
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-09-27 08:34:38

如果在使用页锁或行锁的存储引擎中使用UPDATE,则查询检查的行将被写入锁定,直到当前事务结束为止。使用LOCK IN SHARE MODE设置一个共享锁,该锁允许其他事务读取已检查的行,但不允许读取它们。关于这个查询

代码语言:javascript
复制
UPDATE mytable SET status = 1
WHERE status IS NULL
ORDER BY timestamp DESC
LIMIT 1

既然

在SQL语句的处理过程中自动获取锁,我认为它的工作原理是一样的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12594178

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档