当读/写锁定表时,如何读取行?

时间:2013-11-12 10:02:40

标签: mysql innodb isolation-level readwritelock

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

enter image description here

在会话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仍然保留制造商表上的独占锁,并且据我所知,当表上保持独占锁时,其他任何事务都无法读取或写入,直到提交上一个事务为止。

2 个答案:

答案 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语句也是一致的   彼此。

在这篇文章中,它很好地描述了。

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

  

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

表格是否已编入索引?你能运行一个SHOW ENGINE innodb STATUS来确认是否锁定了吗?