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

在会议A终端机上,我发表了以下声明
UPDATE manufacurer
SET lead_time = 2
WHERE mname = 'Hayleys';在会话B终端中,我尝试将ACL电缆的值lead_time更新为2。但是由于会话A中的前一个update命令尚未提交(而且会话A对制造商表具有独占锁),此更新将等待。这我能理解。
但是,当我试图在B会话上执行SELECT语句时,
SELECT * FROM manufacturer
WHERE mcode = 'ACL';它正确地查询制造商表并给出行。怎么会发生这种事?因为会话A仍然持有制造商表上的独占锁,而且据我所知,当表上持有独占锁时,任何其他事务都不能从读取或写入,直到提交上一个事务为止。
发布于 2013-11-12 10:48:11
可在此页上找到以下信息
事务特性范围
您可以为当前会话或下一个事务全局设置事务特征: 使用全局关键字,该语句将全局应用于所有后续会话。现有会话不受影响。 使用session关键字,该语句将应用于在当前会话中执行的所有后续事务。 如果没有任何会话或全局关键字,则该语句将应用于在当前会话中执行的下一个(未启动)事务。
这是否已考虑在内?
可重复读
这是InnoDB的默认隔离级别。对于一致的读取,与read提交的隔离级别有一个重要的区别:在同一事务中的所有一致读取都读取由第一个READ建立的快照。这个约定意味着,如果在同一事务中发出几个普通(非锁定) SELECT语句,这些SELECT语句也是一致的。
这篇文章很好地说明了这一点。
重要的是要记住,InnoDB实际上锁定的是索引项,而不是行。在语句执行期间,InnoDB必须锁定它所遍历的索引中的每个条目,以找到它正在修改的行。它必须这样做,以防止死锁和保持隔离级别。
这些表索引很好吗?您能运行一个SHOW ENGINE innodb STATUS来确认锁是持有的吗?
发布于 2013-11-12 10:22:07
mysql中有多种锁:行级锁和表级锁。
您需要的是行级锁,它允许在更新行之外读取行。
要实现行级锁,必须将表的引擎类型定义为“InnoDB”:
alter table TABLE_NAME engine=innodb;https://stackoverflow.com/questions/19926126
复制相似问题