首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当表被读/写锁定时,如何读取一行?

问当表被读/写锁定时,如何读取一行?
EN

Stack Overflow用户
提问于 2013-11-12 10:02:39
回答 2查看 2K关注 0票数 2

我正在MySQL 5.6.13上运行这些查询。我使用可重复读取隔离级别。该表如下所示:

​

​

在会议A终端机上,我发表了以下声明

代码语言:javascript
复制
UPDATE manufacurer
SET lead_time = 2
WHERE mname = 'Hayleys';

在会话B终端中,我尝试将ACL电缆的值lead_time更新为2。但是由于会话A中的前一个update命令尚未提交(而且会话A对制造商表具有独占锁),此更新将等待。这我能理解。

但是,当我试图在B会话上执行SELECT语句时,

代码语言:javascript
复制
SELECT * FROM manufacturer
WHERE mcode = 'ACL';

它正确地查询制造商表并给出行。怎么会发生这种事?因为会话A仍然持有制造商表上的独占锁,而且据我所知,当表上持有独占锁时,任何其他事务都不能从读取或写入,直到提交上一个事务为止。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-11-12 10:48:11

可在此页上找到以下信息

repeatable-read

事务特性范围

您可以为当前会话或下一个事务全局设置事务特征: 使用全局关键字,该语句将全局应用于所有后续会话。现有会话不受影响。 使用session关键字,该语句将应用于在当前会话中执行的所有后续事务。 如果没有任何会话或全局关键字,则该语句将应用于在当前会话中执行的下一个(未启动)事务。

这是否已考虑在内?

可重复读

这是InnoDB的默认隔离级别。对于一致的读取,与read提交的隔离级别有一个重要的区别:在同一事务中的所有一致读取都读取由第一个READ建立的快照。这个约定意味着,如果在同一事务中发出几个普通(非锁定) SELECT语句,这些SELECT语句也是一致的。

这篇文章很好地说明了这一点。

http://www.mysqlperformanceblog.com/2012/08/28/differences-between-read-committed-and-repeatable-read-transaction-isolation-levels/

重要的是要记住,InnoDB实际上锁定的是索引项,而不是行。在语句执行期间,InnoDB必须锁定它所遍历的索引中的每个条目,以找到它正在修改的行。它必须这样做,以防止死锁和保持隔离级别。

这些表索引很好吗?您能运行一个SHOW ENGINE innodb STATUS来确认锁是持有的吗?

票数 2
EN

Stack Overflow用户

发布于 2013-11-12 10:22:07

mysql中有多种锁:行级锁和表级锁。

您需要的是行级锁,它允许在更新行之外读取行。

要实现行级锁,必须将表的引擎类型定义为“InnoDB”:

代码语言:javascript
复制
alter table TABLE_NAME engine=innodb;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19926126

复制
相关文章

相似问题

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