我在MySQL 5.6.13上运行这些查询。 我使用可重复的读隔离级别。该表如下所示:
在会话A终端中,我发布了以下声明
UPDATE manufacurer
SET lead_time = 2
WHERE mname = 'Hayleys';
在会话B终端中,我尝试将ACL电缆的值lead_time更新为2.但由于会话A的先前UPDATE命令尚未提交(并且会话A在制造商表上具有独占锁定),因此此更新等待。我可以理解。
但是当我尝试在Session B上执行SELECT语句时,
SELECT * FROM manufacturer
WHERE mcode = 'ACL';
它正确查询制造商表并给出行。怎么会发生这种情况?因为会话A仍然保留制造商表上的独占锁,并且据我所知,当表上保持独占锁时,其他任何事务都无法读取或写入,直到提交上一个事务为止。
答案 0 :(得分:2)
mysql中有多种锁:行级锁和表级锁。
您需要的是行级锁定,它允许读取更新后的行。
要实现行级锁定,您必须将表的引擎类型定义为“InnoDB”:
alter table TABLE_NAME engine=innodb;
答案 1 :(得分:2)
在此页面上找到以下信息
http://dev.mysql.com/doc/refman/5.0/en/set-transaction.html#isolevel_repeatable-read
交易特征范围
您可以为当前设置全局事务特征 会话,或下一次交易:
使用GLOBAL关键字,该语句全局适用于所有人 后续会议。现有会话不受影响。
使用SESSION关键字,该语句适用于所有后续关键字 在当前会话中执行的事务。
没有任何SESSION或GLOBAL关键字,该语句适用于 在当前会话中执行的下一个(未启动)事务。
是否已将此考虑在内?
重复阅读
这是InnoDB的默认隔离级别。对于一致的读取, 与READ COMMITTED隔离有一个重要区别 level:同一事务中的所有一致读取读取 第一次读取建立的快照。这个约定意味着如果 你在同一个中发出几个普通(非锁定)SELECT语句 事务中,这些SELECT语句也是一致的 彼此。
在这篇文章中,它很好地描述了。
重要的是要记住InnoDB实际上锁定索引条目, 不是行。在执行语句期间,InnoDB必须锁定每一个 它遍历的索引中的条目,用于查找正在修改的行。 它必须这样做以防止死锁并保持隔离级别。
表格是否已编入索引?你能运行一个SHOW ENGINE innodb STATUS
来确认是否锁定了吗?