MySQL锁之InnoDB锁实战

在这里插入图片描述

1 问题背景

前面研究了很多锁的概念性知识,并没有很客观形象地了解发生InnoDB锁时到底会有什么现象。今天使用sql实战操作一下,看看InnoDB锁会造成什么现象。

参考自:

  1. InnoDB锁和事务模型之锁
  2. MySQL行锁、表锁、间隙锁

2 前言

针对前面若干篇InnoDB官方文档所学的知识以及相关视频,笔者总结下关于InnoDB锁的知识。本篇博客仅供自己总结回顾以及帮助有需要的人,有不正确的地方请指出。

3 回顾

从前面InnoDB锁和事务模型之锁学习到InnoDB有很多锁,但是从类型上划分,无非就是3种锁:

  • 行锁(锁住的是一行记录,也可以 笼统地认为是索引锁、记录锁)
  • 表锁(锁住的是一整张表
  • 间隙锁(锁住的是一行记录以及记录前面的间隙,可以 笼统地认为锁住的是一段区间)

4 资源准备

MySQL8.0,创建一张表,结构如下所示:

CREATE TABLE `t_product` (
  `a` int(11) NOT NULL,
  `b` varchar(16) DEFAULT NULL,
  KEY `idx_a` (`a`) USING BTREE,
  KEY `idx_b` (`b`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

插入若干条数据,代码如下所示,其中transactionlearn是数据库名:

INSERT INTO `trasactionlearn`.`t_product`(`a`, `b`) VALUES (1, 'b');
INSERT INTO `trasactionlearn`.`t_product`(`a`, `b`) VALUES (3, 'b');
INSERT INTO `trasactionlearn`.`t_product`(`a`, `b`) VALUES (5, 'b');
INSERT INTO `trasactionlearn`.`t_product`(`a`, `b`) VALUES (7, 'b');

5 行锁

5.1 产生行锁时的可重复读

关闭自动提交,开启两个命令窗口,一个窗口代表一个事务。一个事务进行更新记录,一个事务进行查询:

在这里插入图片描述
总结:如上图所示,左边窗口为事务A,右边窗口为事务B。InnoDB默认的隔离级别是Repeatable Read(简称RR,可重复读)。当事务A修改数据但未提交时,事务B第二次查询数据时,仍不会查到事务A改过的数据,只能查到事务A修改数据前的数据,这就叫做可重复读,解决了脏读的问题。只有当事务A提交后,事务B才能查到事务A修改的数据。

5.2 更新同一行记录时的锁竞争

关闭自动提交,开启两个命令窗口,一个窗口代表一个事务。一个窗口进行更新一行记录,另一个窗口也更新同一行记录:

在这里插入图片描述
总结:如上图所示,左边窗口为事务A,右边窗口为事务B。事务A更新a=1的记录,事务B也更新同一条记录。两个事务对这条记录产生锁竞争。事务A先执行,因此事务A先拿到a=1这行记录的锁。因为是更新操作,属于排他锁,只有当事务A执行完并提交,并释放该行记录的锁,事务B才能执行;否则事务B一直阻塞,等待获取锁或者等待超时。

超时的现象如下图所示:

在这里插入图片描述
总结:如上图所示,事务B等待获取该行锁超时,报错。这个报错也常会在生产环境的批量操作场景遇到。相对表级锁而言,行锁比表锁好,减少了因获取锁超时的问题。因此我们应该避免索引失效,让innodb执行行锁,而不是产生表锁,如果常遇到这种获取锁超时的报错,可以优化sql语句让sql走索引,走行锁,避免产生表锁。

6 表锁

关闭自动提交,开启两个命令窗口,一个窗口代表一个事务。一个事务更新a=1a=3这两条记录,让索引失效;另一个事务更新a=5的记录:

在这里插入图片描述
总结:如上图所示,事务A使用了or条件导致索引失效,条件匹配的是a字段。事务B更新另外一条与事务A无关的记录。事务A没有提交。但是两条sql都执行成功了。这与笔者参考的视频中阐述得不一致,推断是MySQL版本不一致,在更高的版本中InnoDB优化了这种情况。

给表再添加一个新的非索引字段c。关闭自动提交,开启两个命令窗口,一个窗口代表一个事务。一个事务更新c=1c=3这两条记录,让索引失效;另一个事务更新c=5的记录:

在这里插入图片描述
总结:事务A通过非索引字段并且使用or条件导致索引失效,事务B更新另一条与事务A无关的记录,被阻塞了。可以看到,如果索引失效,当条件匹配的字段不是索引字段,那么会产生表锁,在持有表锁的事务A未提交的情况下,事务B被阻塞。

7 间隙锁

关闭自动提交,开启两个命令窗口,一个窗口代表一个事务。事务A通过范围条件进行更新记录,事务B往这段范围中插入数据:

在这里插入图片描述
总结:如上图所示,事务A进行范围查询,事务B往该范围插入数据,产生了间隙锁,事务B被阻塞。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
MySQL engine=innodb是指MySQL数据库的一种存储引擎,它是MySQL默认的事务型存储引擎之一。相较于其他存储引擎,InnoDB支持行级、外键约束、事务等高级功能,能够提供更好的数据一致性和可靠性,因此在大多数应用场景下都是推荐使用的存储引擎。是的,您所引用的问题是关于MySQL数据库中的InnoDB存储引擎的。MySQL是一种关系型数据库管理系统,它支持多种存储引擎,而InnoDB是其中一个最流行的存储引擎之一。InnoDB存储引擎具有事务支持、行级、外键约束等高级功能,这些功能可以提供更好的数据一致性和可靠性。因此,对于大多数应用场景,推荐使用InnoDB作为MySQL的存储引擎。是的,您的理解是正确的。MySQL是一种关系型数据库管理系统,支持多种存储引擎。而InnoDBMySQL默认的事务型存储引擎之一,也是其中一个最流行的存储引擎,具有许多高级功能,例如事务支持、行级、外键约束等,可以提供更好的数据一致性和可靠性。因此,在大多数应用场景下,使用InnoDB作为MySQL的存储引擎是推荐的。是的,您的理解是正确的。MySQL是一种关系型数据库管理系统,支持多种存储引擎。而InnoDBMySQL默认的事务型存储引擎之一,也是其中一个最流行的存储引擎,具有许多高级功能,例如事务支持、行级、外键约束等,可以提供更好的数据一致性和可靠性。因此,在大多数应用场景下,使用InnoDB作为MySQL的存储引擎是推荐的。是的,您引用的问题涉及到MySQL数据库中的InnoDB存储引擎。MySQL是一种关系型数据库管理系统,它支持多种存储引擎,而InnoDB是其中一个最流行的存储引擎之一。InnoDB存储引擎具有事务支持、行级、外键约束等高级功能,这些功能可以提供更好的数据一致性和可靠性。因此,对于大多数应用场景,推荐使用InnoDB作为MySQL的存储引擎。是的,这些回答都是关于MySQL数据库中的InnoDB存储引擎的描述,强调了它的一些高级功能,例如事务支持、行级、外键约束等,以及在大多数应用场景下推荐使用它作为MySQL的存储引擎。InnoDB存储引擎的特性和优点使其成为MySQL数据库管理系统中广泛使用的默认存储引擎之一。MySQL中的InnoDB是一种支持事务处理和行级定的存储引擎。它是MySQL的默认存储引擎,它提供了数据完整性、高效性和可靠性。相比于MyISAM存储引擎,InnoDB存储引擎在并发性能、事务支持和崩溃恢复方面都有很大优势,因此在需要处理高并发、高可用性和数据一致性要求较高的应用场景中广泛使用。MySQL中的engine参数是用来指定表的存储引擎的,其中InnoDBMySQL的一种常用的存储引擎之一。它支持ACID事务,提供了高度的数据完整性和并发性,并且具有良好的性能表现。InnoDB引擎适合用于需要高并发、高可靠性和事务支持的应用程序。MySQLInnoDB是一种数据库引擎,它支持事务处理和外键约束,是MySQL默认的存储引擎。它使用了行级定和多版本并发控制(MVCC)来提高并发性能和数据的一致性。InnoDB还提供了高可用性和可靠性,支持崩溃恢复和自动故障转移。由于它的特性,InnoDB适用于大型高并发的应用程序,如电子商务网站和金融系统。MySQL是一种流行的关系型数据库管理系统,而InnoDBMySQL的一种存储引擎,用于管理MySQL中的数据存储和检索。它支持事务、行级、外键等功能,并且在处理高并发、大容量数据时表现良好。InnoDB还具有自动崩溃恢复和数据恢复功能,能够有效保障数据的完整性和可靠性。相比于MySQL的其他存储引擎,InnoDB更加适合于大型企业级应用和高性能的Web应用程序。MySQLInnoDB是一种关系型数据库引擎,它是MySQL默认的存储引擎之一。InnoDB支持事务处理和外键约束,可以提供更高的数据完整性和并发性能。相比于其他MySQL存储引擎,InnoDB具有更好的性能和可靠性,并且在高并发读写的情况下表现更出色。同时,InnoDB也支持行级定,允许多个用户同时访问同一张表而不会出现数据混乱的情况。MySQL Engine=InnoDBMySQL数据库管理系统中的一种存储引擎。InnoDB存储引擎支持事务、行级定和外键等功能,这使得它成为处理高并发读写操作的理想选择。此外,InnoDB还支持自动恢复功能,能够保护数据库的完整性和可靠性。因此,在处理高负载事务型应用程序方面,InnoDB是一种被广泛采用的存储引擎。 MySQL 引擎= InnoDB 是一种关系型数据库管理系统,用来存储、管理和访问数据。它可以处理大量数据,并具有良好的安全性和可靠性。MySQL的存储引擎InnoDB是一种可靠性高、事务处理能力强的存储引擎。它支持ACID事务模型,并提供行级定,可有效地减少定竞争,提高并发性能。InnoDB还支持外键约束、多版本并发控制(MVCC)和崩溃恢复等功能,使得它成为了MySQL中最常用的存储引擎之一。MySQL是一种常用的关系型数据库管理系统,而InnoDB则是MySQL的一种存储引擎,它是MySQL默认的事务型存储引擎。InnoDB存储引擎支持ACID事务,可以提供高并发的读写性能和数据安全性,同时也支持行级和外键等高级特性。因此,在MySQL中使用InnoDB存储引擎可以提高数据库的性能和可靠性。MySQL中的InnoDB是一种存储引擎,用于处理数据存储和检索。它支持事务、行级定和外键约束等高级功能,是MySQL中最流行的存储引擎之一。使用InnoDB可以提高MySQL数据库的性能和可靠性。MySQL Engine=InnoDBMySQL的一种存储引擎,它支持事务、行级定、外键约束等功能。与其他存储引擎相比,InnoDB具有更好的数据完整性和可靠性。同时,它还支持较高的并发性和性能。在MySQL中,InnoDB是默认的存储引擎。MySQL Engine=InnoDBMySQL 数据库的一种存储引擎,它支持事务、行级定和外键约束等特性。InnoDB 存储引擎被广泛应用于 MySQL 数据库中,特别是对于要求高并发、高可用性和数据完整性的应用程序。它也是 MySQL 默认的存储引擎。 我可以为您提供关于MySQL InnoDB引擎的帮助。 我们使用InnoDB作为MySQL引擎。 您可以使用InnoDB引擎来运行MySQL数据库MySQL中的InnoDB是一种存储引擎,它提供了事务处理、并发控制和崩溃恢复功能。相比于MySQL的其他存储引擎,如MyISAM,InnoDB支持更高级的事务处理,更好的并发性和更高的容错性。InnoDB还支持外键约束,可以保证数据的完整性和一致性。由于InnoDB具有这些优点,因此在大多数情况下,它被认为是MySQL的首选存储引擎。MySQLInnoDB引擎是一种事务性存储引擎,具有高度的数据完整性和并发性能。它支持行级定和外键约束,可提供更高的并发性和更好的数据保护。InnoDB还支持ACID(原子性,一致性,隔离性和持久性)事务,使其非常适合应用程序处理事务性数据。MySQL中的InnoDB是一种存储引擎,它是MySQL默认的事务型存储引擎。与其他存储引擎相比,InnoDB支持ACID事务处理,具有更好的并发性能和更好的数据完整性保障,还提供了行级定机制,可以提高数据库的并发性能。InnoDB还支持外键约束,可以保证数据的完整性。因此,如果需要保证数据的一致性和完整性,并需要支持并发访问,使用InnoDB存储引擎是一个不错的选择。MySQLInnoDB是一种常见的存储引擎,它支持ACID事务,并且具有良好的并发性能和数据完整性。相对于MySQL的另一种存储引擎MyISAM,InnoDB支持更好的并发性和更好的数据一致性,但在处理大量只读查询时可能会稍微慢一些。InnoDB还支持行级定,这使得多个并发事务可以在同一时间修改不同的行,从而提高了数据库的并发性能。MySQLInnoDB是一种关系型数据库引擎,它是MySQL的默认引擎。InnoDB提供了事务处理、行级定、外键约束等功能,适用于需要高性能、高可靠性的应用程序。与其他引擎相比,InnoDB可以更好地处理高并发环境下的读写操作,并且支持更大的数据量。MySQL引擎InnoDBMySQL的一种关系型数据库存储引擎,它支持ACID事务处理,具有高并发性和稳定性,同时还支持行级定和外键约束等高级功能。因此,InnoDBMySQL数据库中被广泛使用,尤其适合处理大量数据的高负载应用程序。MySQL的存储引擎(storage engine)之一是InnoDB。它是MySQL数据库管理系统的一个标准引擎,支持事务处理和外键约束等高级功能。相对于其他存储引擎,InnoDB的优点包括:支持事务处理,具有较好的数据完整性和稳定性,可以在高并发环境下提供更好的性能。MySQL引擎InnoDB是一种流行的关系型数据库管理系统(RDBMS)的存储引擎。它是MySQL的默认存储引擎,它支持事务、行级、外键等特性。InnoDB引擎还使用缓冲池(也称为缓存)来提高数据检索性能,并提供了高可靠性和容错能力。InnoDB还支持对大量数据进行处理和管理,使其成为处理复杂应用程序的理想选择。MySQLInnoDB是一种常用的存储引擎。它支持事务处理和外键约束,提供高效的读写性能和可靠性,被广泛用于各种规模的应用程序中,包括Web应用程序和企业级系统。与MySQL的其他存储引擎相比,InnoDB可以更好地处理高并发和大量数据的情况,因此在需要处理复杂查询和大量数据的应用程序中使用InnoDB是比较常见的选择。InnoDBMySQL 数据库的一种存储引擎,它是一种事务性、支持行定和外键约束的存储引擎。与 MyISAM 引擎相比,InnoDB 引擎具有更好的事务处理能力和并发性能。同时,InnoDB 引擎还支持多版本并发控制(MVCC)和缓冲池等高级特性,使其在高并发环境下表现更加出色。因此,对于需要进行事务处理或者需要更好的并发性能的应用程序,建议使用 InnoDB 引擎作为 MySQL 的存储引擎。MySQL中的InnoDB是一种数据库存储引擎,它是MySQL的默认存储引擎。InnoDB支持事务处理和行级定等高级功能,这使得它非常适合用于大型或高并发的应用程序。与MyISAM存储引擎相比,InnoDB存储引擎更加健壮、可靠,并提供更多的安全性和完整性控制。MySQLInnoDB是一种支持事务处理的存储引擎。相比于MyISAM存储引擎,InnoDB支持行级定和外键约束等高级特性。在高并发的数据库应用中,InnoDB常常比MyISAM表现更出色,尤其是当需要处理大量的INSERT和UPDATE操作时。因此,在选择MySQL存储引擎时,InnoDB是一个非常好的选择。MySQL引擎InnoDB是一种关系型数据库管理系统的存储引擎,它支持事务处理、行级定以及外键约束等高级特性,同时还具有高可靠性、高可用性和高性能的特点,因此被广泛应用于企业级应用中。相比其他存储引擎,InnoDB对于大量并发访问和数据更新的场景下表现更为优异。MySQL中的InnoDB是一种存储引擎,它是MySQL的默认存储引擎。InnoDB是一个支持事务处理和行级定的存储引擎,它提供了高度可靠性和性能。InnoDB使用了多版本并发控制(MVCC)来实现行级定,这允许多个事务同时读取同一表而不会相互干扰,同时提供了强大的数据完整性和一致性。此外,InnoDB还支持外键约束、提交、回滚和崩溃恢复等重要功能,这些功能使其成为了一个非常受欢迎的存储引擎。MySQLInnoDB是一种常见的数据库引擎,它支持事务处理和行级定。InnoDB使用聚簇索引,这使得它在处理大量数据时非常高效,并且在并发访问情况下具有很好的性能表现。此外,它还支持外键约束和其他高级特性,这使得它成为许多应用程序的首选引擎之一。"mysql engine=innodb" 是 MySQL 数据库中指定 InnoDB 存储引擎的命令。InnoDBMySQL 的一种事务性存储引擎,它支持行定、外键约束等高级特性,可以提高数据库的可靠性、安全性和性能。在创建表时,可以使用这个命令指定使用 InnoDB 存储引擎,例如: ``` CREATE TABLE my_table ( id INT(11) NOT NULL AUTO_INCREMENT, name VARCHAR(50) NOT NULL, PRIMARY KEY (id) ) ENGINE=InnoDB; ``` 以上命令将创建一个名为 my_table 的表,并指定使用 InnoDB 存储引擎。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值