innodb锁和事务隔离级别

innodb锁和事务隔离级别

最近,我收到了一个用户关于我早期博客帖子的问题。 因为它不是作为评论发送的,我会在这里回答。 问题是:

>我正在读你的文章:
> https://www 。percona。com/resources/technical-presentations/疑难解答-lock-issues-percona-MySQL-webinar

>全表扫描锁定整个表。

>某些错误的选择(读取)查询可以在InnoDB上进行全表扫描,它会锁定整个表吗?

>我的理解是,挑选 sqlserver数据库同步 (read)只在MyISAM中阻止另一个DML。

要回答这个问题,我们需要理解两个不同的概念:锁定和事务隔离级别。

在InnoDB的默认事务隔离模式下, 可重复读 下层 交易隔离 级别, 挑选 不会阻止任何DML,除非它使用 选择。用于更新 或者 选择。锁定共享模式. 在我的演示文稿的第20 (31)张幻灯片中,我使用了 选择。用于更新 语句(这就是为什么会看到锁)。

但是,如果事务隔离模式为 SERIALIZABLE,那么 SELECT 可以阻止更新。 您可以在下面的示例中看到这一点:

mysql1 >设置事务隔离级别可序列化;

查询正常,0行受影响(0,00秒)

mysql1 >开始;

查询正常,0行受影响(0,00秒)

mysql1 >使用(emp_no)从员工加入标题中选择*;

c 936 E6 fc 4c 6 cbaf 77679 ba 5013339 dff-

集合中的443308行(29,69秒)

mysql2 >开始;

查询正常,0行受影响(0,00秒)

mysql2 >更新标题集标题= ‘工程师’,其中emp _ no = 15504

错误1205 (HY000):超过锁定等待超时;尝试重新启动事务

关于InnoDB设置的不同级别的锁定,我建议您遵循演示文稿第37 (67)张幻灯片上的链接,特别是比尔·卡温的“InnoDB锁定用棍图解释”。 彼得·扎依采夫在这篇博文中也很好地解释了InnoDB表锁。