表级锁
开销小,加锁快,不会出现死锁。锁冲突概率高,并发度低
行级锁
开销大,加锁慢;会出现死锁,锁冲突概率低,并发度高。
页级锁
开销和加锁时间介于上面两种之间。会出现死锁。
myisam 只支持表级锁。
show status like 'table%';
mysql> show status like 'table%';
+-----------------------+-------+
| Variable_name | Value |
+-----------------------+-------+
| Table_locks_immediate | 43 |
| Table_locks_waited | 0 |
+-----------------------+-------+
2 rows in set (0.00 sec)
Table_locks_waited 表级锁的争用情况
表锁的两种情况:表共享读锁,表独占写锁。
读锁不会阻塞对同一表的读请求。但是会阻塞对同一表的写请求。
写锁会阻塞对同一表的读和写的请求。
lock table boss_info write|read;获得boss_info表的写|读锁
lock table boss_info read local 支持锁定表后,其他用的并发写入。
unlock tables; 解锁
从上面可看出,myisam读写串行的。一定条件下myisam支持查询和写入的并行。
系统变量concurrent_insert
0 不允许并行插入
1 表中间没有被删除的空洞时,允许并行插入
2 不论表中有有无空洞,都允许并行插入
可以将concurrent_insert设置为2,并定时进行optimize table整理空间碎片。
myisam读写串行。在同时有读写锁定请求时,先获取到写锁。所以myisam不适合做大量更新操作和查询操作应用的
原因。大量的更新操作会造成查询操作的阻塞。不过可以通过设置来条件myisam锁调度。
set low_priority_updates = 1 降低更新请求的优先级。
set low_priority_inserts = 1
set low_priority_deletes = 1
set low_priority_selects = 1
innodb的锁问题
更新丢失: 最后的事务更新的覆盖了其他事务的更新。
脏读:一个事务更新数据,还未提交;其他事务读取同一条记录。update select
不可重复读: 一个事务在读取某些数据后的某个时间,再次读取以前读过的数据,发现数据发生了更新。select delete select
幻读:一个事务根据条件读取某些数据后,重新按照条件读取以前检索过的数据,其他事务插入了满足查询条件的
新数据。select insert select
如何解决并发事务带来的问题:
1、读取数据前,对其加锁,阻止其他事务对数据进行修改
2、不加锁,生成一个数据请求时间点的一致性数据快照,并用这个快照提供一定级别的一致性读取。
就像提供了同一个数据的多个版本。因此也叫多版本并发控制MVCC或MCC
事务的隔离级别:
未提交读: 可能脏读|不可重复读|幻读
已提交读: 不会脏读|不可重复读|幻读
可重复读: 不会脏读|可重复读|幻读
可序列化: 不会脏读|可重复读|不会产生幻读
show status like 'innodb_row_lock%';
mysql> show status like 'innodb_row_lock%';
+-------------------------------+-------+
| Variable_name | Value |
+-------------------------------+-------+
| Innodb_row_lock_current_waits | 0 |
| Innodb_row_lock_time | 0 |
| Innodb_row_lock_time_avg | 0 |
| Innodb_row_lock_time_max | 0 |
| Innodb_row_lock_waits | 0 |
+-------------------------------+-------+
5 rows in set (0.00 sec)
如果Innodb_row_lock_waits和Innodb_row_lock_time_avg比较高,则锁争用情况比较严重;
可以设置InnoDB Monitors进一步观察发生锁冲突的表、数据行等,并分析争用原因
create table innodb_monitor (a int) engine=innodb;
show innodb status
drop table innodb_monitor;
打开监视器后,平均15秒会向日志中记录监控的内容,如果长时间打开监控,会导致.err文件
变得非常巨大。
innodb 行锁
共享锁:允许一个事务读取一行,阻止其他事务获得相同数据集的排他锁。
排他锁:允许获得排他锁的事务更新数据,阻止其他事务取得相同数据集的共享读锁和排他写锁。
innodb 表锁:
意向共享锁:事务在给数据行加行共享锁前必须获得表的意向共享锁
意向排他锁:事务在给数据行加行排他锁前,必须获得表的意向排他锁。
获得共享锁:
select * from table where ... in share mode;
获得排他锁:
select * from table where ... for update;
innodb行锁是通过给索引上的索引项加锁来实现的。oracle是通过对数据块中的数据行加锁来实现的。
所以,只有通过索引条件检索数据时,innodb才会使用行级锁。否则将会使用表锁。
1、使用相同索引,虽然是对不同记录行操作,也会出现锁冲突。
2、表中有多个索引时,不同事务可以使用不同的索引锁定不同的行。
3、索引字段的类型与参数的类型是否一致,是否会进行类型转换。
分享到:
相关推荐
这份"mysql学习资料大全"包含了一系列的资源,对于想要学习或深入理解MySQL的人来说,是一份非常宝贵的资料集。 首先,从标题我们可以推断,这份资料可能涵盖了MySQL的基础到进阶内容,包括安装配置、SQL语言基础、...
这份压缩包包含的三本书籍是MySQL学习的重要资源,涵盖了从基础到高级的全方位知识。 《MySQL必知必会》这本书是MySQL入门的经典之作,适合对数据库没有基础知识的读者。它详细介绍了MySQL的基本操作,包括如何创建...
在这个“mysql学习用数据库dbt3”压缩包中,包含了一个名为“dbt3_s1.sql”的文件,这通常是用来初始化或恢复数据库的SQL脚本。 在学习MySQL的过程中,理解数据库的设计和管理至关重要。DBT3提供了一种实践环境,让...
本“Mysql学习资料大全”包含了一系列关于MySQL的教程和参考资料,旨在帮助初学者和经验丰富的开发者深入理解和熟练掌握MySQL的各项功能。 首先,从简介及连接部分开始,这部分内容会涵盖MySQL的基本概念,如数据库...
本资源“数据库mysql学习脑图”旨在为MySQL初学者提供一个清晰的学习路径,帮助理解其核心概念和功能。 首先,脑图将可能涵盖数据库基础,包括数据库的概念、数据模型(如层次模型、网状模型、关系模型)以及SQL...
这个“mySQL学习资料.rar”压缩包很可能包含了一系列关于MySQL的学习材料,如教程、手册、示例脚本和使用指南,旨在帮助初学者和进阶者深入理解和掌握MySQL。 首先,让我们来探讨一下MySQL的基础知识。MySQL的核心...
MySQL学习手册中文版是一本全面介绍MySQL数据库管理系统的基础知识的指南,适合初学者及有一定经验的用户进行深入学习。MySQL是一种广泛使用的开源关系型数据库,它以其高效、稳定和易于管理的特点,在各种规模的...
【Linux下MySQL学习笔记】 MySQL是一款广泛应用于互联网的开源关系型数据库管理系统,尤其在Linux操作系统上,其稳定性和性能表现尤为突出。本笔记主要针对在Linux环境下安装、配置、管理和优化MySQL的过程进行详解...
数据库 MySQL 学习笔记高级篇.md
MySQL学习源码(MySQL入门教程).zipMySQL学习源码(MySQL入门教程).zipMySQL学习源码(MySQL入门教程).zipMySQL学习源码(MySQL入门教程).zipMySQL学习源码(MySQL入门教程).zipMySQL学习源码(MySQL入门教程).zipMySQL...
MySQL学习资料.zip,包括MySQL基础、进阶、运维
这份“MySQL学习资料”包含了丰富的信息,旨在帮助初学者和有经验的用户更好地理解和操作MySQL。 首先,`MySQL_5.1中文文档`是MySQL 5.1版本的官方中文手册,它是了解和学习MySQL功能、语法、最佳实践的重要资源。...
机房精空调分类2023+MySQL学习练习数据库+MySQL学习毕业设计机房精空调分类2023+MySQL学习练习数据库+MySQL学习毕业设计机房精空调分类2023+MySQL学习练习数据库+MySQL学习毕业设计机房精空调分类2023+MySQL学习练习...
### MySQL学习文档知识点详解 #### 一、MySQL简介与特性 **标题与描述解析:** - **标题**:“Mysql学习文档”表明该文档旨在帮助读者掌握MySQL的相关知识和技术。 - **描述**:“文档讲述的从入门到精通的课程...
1. 数据库概念:了解数据库的基本概念,如数据库、表、字段、记录和索引等,是MySQL学习的基础。数据库是用来存储和管理数据的系统,而表则是数据的结构化存储方式。 2. SQL语言:SQL(Structured Query Language)...
以上就是根据给定文件信息总结出来的MySQL学习文档中的核心知识点。希望这些内容能帮助初学者更好地理解和掌握MySQL的基础操作。随着对MySQL的深入学习,还可以探索更多高级功能,例如事务处理、存储过程、触发器等...
这份"MYSQL 学习指南"旨在帮助初学者和有一定经验的开发者深入理解MySQL的各个方面,提升数据库管理技能。 首先,从基础开始,MySQL的核心概念包括数据库、表、字段和记录。数据库是存储数据的容器,而表则是组织...
这个“mysql学习资料 45讲 深度学习”压缩包包含了多个PDF文件,涵盖了MySQL的关键知识点,包括性能优化、高可用性、主备一致性和安全性等方面。下面我们将深入探讨其中几个关键的主题。 1. **"order by"是怎么工作...
这份"Mysql Mysql学习资料"涵盖了关于MySQL的基础到高级的知识点,对于想要深入理解数据库管理和开发的人员来说是一份宝贵的资源。 1. **MySQL基础知识** - 数据库概念:理解数据库是什么,以及它在存储和管理数据...
"必知必会MySQL学习"的压缩包文件显然旨在提供一个全面的学习资源,帮助初学者或进阶者深入理解MySQL的核心概念和技术。在这个教程中,我们可以期待涵盖以下几个关键知识点: 1. **基础概念**:首先,我们会学习...