附录:前段时间学习了下innodb锁的相关知识,对锁和事务有了大体理解,这里做个小总结。
1.Innodb事务和锁的关系。
Innodb区别于MyISAM的两个特点就是Innodb对于事务的支持和对行锁的支持。事务要求了一组SQL语句的ACID特性,同时为了避免对一行记录的并发更新,innodb本身会在一定情况下加锁,然后等语句所在的事务退出后(rollbak或者commit)释放锁。其实在autocommit=true时,一个sql本身就是一个事务。
Innodb在执行Update,Delete,Insert时会对记录加写锁(排他锁,加上排他锁后,不能再加共享锁和排他锁)。而Select语句不会对记录加锁。
共享锁:SELECT * FROM table_name WHERE ... LOCK IN SHARE MODE。
排他锁(X):SELECT * FROM table_name WHERE ... FOR UPDATE。
举例:
如图,左侧事务加了排他锁(for update),右侧事务直接查询不会等待(不加锁),加排他锁失败,加共享锁失败(lock in share mode)。左侧事务提交或者回滚后,释放锁。
2.Innodb的行锁特性。
Innodb使用行锁加锁记录,也就是说会在加锁条件下对访问的具体行进行加锁,而不会锁住全表。这样能够大大提高表访问的吞吐量,减少不必要的记录锁。而Innodb的行锁是使用索引实现的,因此有一下几点需要注意:
- 如果对已一条加锁语句访问的数据走不了索引或者没加索引,其实他锁的是全表,这点需要注意。
- 如果索引使用的是范围,那么他会锁住命中的记录,同时会锁住不存在的记录间隙防止插入(这一行并不存在),gap lock。
如图
左边事务锁住了age>3的记录,那么很自然age=4的记录会被锁住。而在右边事务中,插入一条age=5个记录,而插入操作被hang住,这就是间隙锁。间隙锁是为了避免幻象读的发生,即A事务批量update condition=x的记录,同时B事务插入了一条condition=X的记录,那么A事务提交后,发现仍然存在一条没有更新的记录,貌似出现了幻觉,这就是幻读。
因为间隙锁似乎为了防止插入,所以update age=5并不锁表,因为记录并不存在- -。
- 如果两个查询走不同索引,但是却需要处理同一条记录,会竞争锁。
- 虽然两个查询到的记录不同,但是走的是同一个索引,那么依然会竞争锁。
例如:
learntransaction表在age加了索引,左边窗口查询age=122 AND id=6的记录,右边窗口查询age=122 and id=3的记录,可以发现两者的记录并不同,但是却出现了锁竞争,因为两个公用了一个索引age=122。
-
当where语句的查询字段涉及到多个索引时,mysql会优化sql决定走的索引,所以如果id也加了索引,那么索然在where语句里age在前面,但不一定走age的索引而走了id的索引。所以这个时候对于怎么加锁需要看具体索引的使用情况,建议使用explain工具查询执行计划判断。
这里需要注意的是,慢查询导致数据库hang住并不一定是因为竞争锁,慢查询可能因为要更新的记录太多,导致sql迟迟无法完成,而innodb默认32个槽,也就是32个并发工作线程,当32个线程都在运行而无法接收新的sql时,数据就可能被hang住了,而与锁无关。
参考资料:
《深入浅出MySQL——数据库开发、优化与管理维护》 http://book.51cto.com/art/200803/68127.htm
相关推荐
### 辛星笔记之InnoDB索引 #### 第一节:算法基础 ##### 二分查找法 二分查找法(Binary Search),又称折半查找法,是一种高效的查找算法,适用于有序数组。它的工作原理是首先将目标值与数组中间位置的元素进行...
本学习笔记将深入探讨MySQL中的索引原理、类型、创建与优化策略,帮助你提升数据库查询效率。 一、索引概念 索引是数据库中用于快速查找数据的数据结构,类似于书籍的目录,可以极大地提高查询速度。没有索引,...
MySQL OCP 超详细学习笔记.pdf 是一份详细的 MySQL 学习笔记,旨在帮助 MySQL DBA master 数据库管理的知识和技能。本笔记涵盖了 MySQL 的多个方面,包括 MySQL 的配置、性能优化、索引管理、事务处理等。 首先,...
这份"MySQL学习笔记"涵盖了SQL基本语法和MySQL的关键概念,是初学者和进阶者深入了解数据库管理的宝贵资源。 首先,我们来看看SQL基本语法。SQL,全称Structured Query Language(结构化查询语言),是用于操作关系...
MySQL 是一款广泛使用的开源关系型数据库管理系统,其学习笔记涵盖了多个关键知识点。以下是对这些知识点的详细解释: 1. **MySQL 体系架构** - **网络连接层**:处理客户端的连接请求,包括连接管理、认证和安全...
【尚硅谷周阳Mysql高级思维导图脑图学习笔记】是针对MySQL数据库系统的一份高级学习资料,包含了丰富的知识体系,旨在帮助学习者深入理解并掌握MySQL的高级特性和优化技巧。这份资源以.mmap格式提供,这是一种专业的...
这份“MySQL个人学习笔记”涵盖了从基础到进阶的多个方面,旨在帮助学习者全面理解MySQL的使用。 1. **安装与配置**: 在开始学习MySQL之前,你需要了解如何在不同的操作系统上安装MySQL服务器,如Windows、Linux...
### MySQL学习笔记——叶志镔.pdf #### 行锁与并发控制 在MySQL的InnoDB存储引擎中,采用了一种称为“多版本并发控制”(MVCC)的技术,该技术与传统的基于锁的并发控制机制形成对比。MVCC的主要优势在于能够确保...
MySQL性能优化是DBA的核心工作之一,包括查询优化、索引设计、存储引擎的选择(InnoDB vs MyISAM)、事务处理和并发控制。笔记会探讨如何通过EXPLAIN分析查询执行计划,以及如何利用慢查询日志来定位性能瓶颈。 六...
这篇鲁班学院的MySQL底层原理分析学习笔记将深入探讨MySQL的核心机制,帮助读者理解数据存储、查询优化、事务处理以及并发控制等关键概念。 1. **存储引擎**:MySQL支持多种存储引擎,如InnoDB(事务安全,支持行级...
《高性能MySQL学习笔记》是一份全面探讨MySQL数据库优化与高效运用的资料集合,旨在帮助读者深入理解MySQL的内部机制,并掌握提升数据库性能的各种策略和技术。这份笔记可能包含了多个章节,涵盖了从基础概念到高级...
本学习笔记旨在提供全面的MySQL语法知识,帮助读者从基础到进阶,掌握数据库管理和开发的基本技能。 首先,我们需要理解SQL(Structured Query Language),这是一种用于管理关系数据库的标准编程语言。SQL的主要...
这份“超经典mysql dba学习笔记”包含了丰富的MySQL运维知识,对于想要深入理解和掌握MySQL DBA技能的人来说是一份宝贵的资料。 一、MySQL基础知识 在学习MySQL DBA之前,首先需要了解MySQL的基本概念,包括数据库...
InnoDB表空间是由一系列的数据文件(.ibd)组成的,这些文件包含了数据库的表数据、索引和其他元数据。每个数据文件被划分为固定大小的页(通常是16KB),这些页是InnoDB存储和读取数据的基本单位。`py_innodb_page_...
这份“大神写的MySQL DBA学习笔记”无疑是深入理解和掌握MySQL技术的重要资源,尤其适合那些希望提升自己在数据库管理领域技能的人。笔记内容可能涵盖了从基础概念到高级实践的全方位知识,包括但不限于以下关键点:...
MySql InnoDB 内存管理、索引实现、记录存储剖析 笔记。学习的内容会进行不定期更新,欢迎提意见
尚硅谷的这份“MySQL学习笔记”可能包含了从基础到进阶的各种教程和实战案例,帮助学习者全面掌握MySQL的相关技能。以下是对这份笔记可能包含的一些核心知识点的详细说明: 1. **MySQL安装与配置**:笔记可能首先...
这份“MySQL工作学习笔记”压缩包文件可能是由一位经验丰富的数据库管理员或开发者整理,包含了关于MySQL的深入理解和实践技巧。尽管没有具体的标签来指导,但我们可以从“MySQL工作学习笔记”这个标题推测,内容...
MySQL数据库优化学习笔记 在数据库管理系统中,MySQL是一款广泛应用的关系型数据库,因其开源、免费、高效的特点,被广泛用于各种规模的项目。然而,随着数据量的增长和业务复杂度的提高,性能优化变得至关重要。本...
这份超经典的MySQL DBA学习笔记将帮助你掌握MySQL的核心概念和技术,无论是对于初学者还是经验丰富的DBA,都能从中受益。通过深入学习和实践,你将能够有效管理、优化和保护MySQL数据库,提升系统的稳定性和效率。