Mysql的外键约束、内外连接查询以及锁(下)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: Mysql的外键约束、内外连接查询以及锁(下)

三、Mysql的锁


(1)锁的概述


  • MySQL的锁机制,就是数据库为了保证数据的一致性而设计的面对并发场景的一种规则。
  • 锁最显著的特点是不同的存储引擎支持不同的锁机制,InnoDB支持行锁和表锁,MyISAM支持表锁。


表锁就是把整张表锁起来,特点是加锁快,开销小,不会出现死锁,锁粒度大,发生锁冲突的概率高,并发相对较低


行锁就是以行为单位把数据锁起来,特点是加锁慢,开销大,会出现死锁,锁粒度小,发生锁冲突的概率低,并发度也相对表锁较高。


死锁是指两个或多个事务在同一资源上相互占用,并请求锁定对方占用的资源,从而导致恶性循环


  • 行锁增加了系统的开销,要比表锁系统开销大


当事务试图以不同的顺序锁定资源时,就可能产生死锁。多个事务同时锁定同一个资源时也可能会产生死锁


(2)MyISAM的锁调度


  • 在MyISAM引擎中,读锁和写锁是互斥的,读写操作是串行的,读锁个写锁都有队列,锁设计方案如下:


对于写操作:如果表上没有锁,则在上面加一把写锁,否则,把请求放到写锁队列中

对于读操作:如果表上没有锁,则在上面加一把读锁,否则,把请求方到读锁队列中


这个意思就是说MyISAM在执行查询语句前,会自动给涉及的所有表加读锁,在执行更新语句(增删改操作)前,会自动给涉及的表加写锁,这个过程并不需要用户干预


  • 当一个锁被释放时,锁定权会先被写锁队列中的线程得到,当写锁队列中的请求都跑完后,才轮到读锁队列中的请求。也就是说写锁比读锁的优先级高


即使读请求先到锁等待队列中,写请求后到,写请求也会插入到读请求之前!这就是MySQL认为写请求一般比读请求重要


MyISAM的这种锁调度就意味着,如果一个表上有很多更新操作,那么select语句将等待直到别的更新都结束后才能查到东西。这也就是为什么MyISAM表不适合大量更新操作应用的原因,因为大量更新操作可能导致查询操作很难获得读锁,从而长久阻塞,致使程序响应超时。


(4)表锁语句


MyISAM和InnoDB两种引擎语句都一样


语句 作用
LOCK TABLES 表名称 READ 加读锁,可读,但不能更新。
LOCK TABLES 表名称 WRITE 加写锁,其他会话不可读,不可写。意思是只有当前给表上锁的会话可以读,除此之外都不行
UNLOCK TABLES 表名称 释放锁,只能全部解锁,不能指定
mysql> lock tables aaa read; #加读锁
Query OK, 0 rows affected (0.00 sec)
mysql> lock tables aaa write; #加写锁
Query OK, 0 rows affected (0.00 sec)
mysql> unlock tables; #解锁
Query OK, 0 rows affected (0.00 sec)

(3)innoDB锁的类型


-共享锁(S锁、读锁)


一个事务获取了一个数据行的读锁,允许其他事务也来获取读锁,但是不允许其他事务来获取写锁。也就是说,一个表上了读锁之后,其他事务也可以来读,但是不能增删改。


-排他锁(X锁、写锁)


一个事务获取了一个数据行的写锁,其他事务就不能再跑来获取任何锁了,所有请求都会被阻塞,直到当前的写锁被释放。


-意向共享锁(IS)


事务在给一个数据行加共享锁之前必须先取得该表的IS锁


-意向排他锁(IX)


事务在给一个数据行加共享锁之前必须先取得该表的IX锁


-MDL锁


在事务中,InnoDB会给涉及的所有表加上一个MDL锁,其他事务就不可以执行任何DDL语句的操作 (只要在事务中,不管是查询语句还是更新语句,涉及到的表都会被加上MDL锁)


这三种锁,都是InnoDB内部使用的锁


(4)行锁的技术


表锁是锁整个表,行锁是锁行数据


-记录锁(record lock)


这是一个索引记录锁,它是建立在索引记录上的锁(主键和唯一索引都算),很多时候,使用行锁去锁一条数据,由于无索引,往往会导致整个表被锁住,建立合适的索引可以防止mysql扫描整个表,从而防止整个表被锁死


如:开两个会话,两个事务,并且都不commit提交,该表有主键,两个会话修改同一条数据,第一个会话update更新执行后,第二个会话的update更新是无法执行成功的,会进入等待状态,但是如果update更新别的数据行就可以成功。


再例如:开两个会话,两个事务,并且都不commit提交,并且该表无主键无索引,那么第二个会话不管改什么都会进入等待状态。因为无索引的话,整个表的数据都被第一个会话锁定了。


-锁等待和死锁


  • 锁等待:是指一个事务过程中产生的锁,其他事务需要等待上一个事务释放它的锁,才能占用该资源,如果该事务一直不释放,就需要继续等待下去,直到超过了锁等待时间,会报一个超时错误。


查看锁等待允许时间:

mysql> SHOW VARIABLES LIKE "innodb_lock_wait_timeout";
+--------------------------+-------+
| Variable_name            | Value |
+--------------------------+-------+
| innodb_lock_wait_timeout | 50    |
+--------------------------+-------+
1 row in set (0.00 sec)


死锁:是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,就是所谓的死循环


**典型的案例就是两个事务并发,同时执行,同时修改自己的一条数据,紧接着又修改对方的锁定的那条数据,都要等待对方的锁,死锁就产生了 **


出现死锁的问题并不可怕,解决死锁通常有如下办法:


  1. 不要把无关的操作放到事务里,小事务发生冲突的概率较低
  2. 如果不同的程序会并发存取多个表,应尽量约定以相同的顺序来访问表,这样事务就会形成良好的查询并且没有死锁
  3. 尽量按照索引去查数据,减少发生死锁的可能性,使用范围查找会增加锁冲突的可能性
  4. 对于非常容易产生死锁的业务部分,可以尝试升级锁粒度,通过表锁定来减少死锁产生的概率


(5)锁的监控


查询哪些表正在被锁定:

mysql> SHOW OPEN TABLES WHERE In_use > 0; #查看哪些表正在被锁定
+----------+-------+--------+-------------+
| Database | Table | In_use | Name_locked |
+----------+-------+--------+-------------+
| aaa      | aaa   |      1 |           0 |
+----------+-------+--------+-------------+
1 row in set (0.00 sec)
#这个命令监控的是被表锁锁住的表,如果用行锁,这个命令是没有反应的

通过表锁定来减少死锁产生的概率**


(5)锁的监控


查询哪些表正在被锁定:

mysql> SHOW OPEN TABLES WHERE In_use > 0; #查看哪些表正在被锁定
+----------+-------+--------+-------------+
| Database | Table | In_use | Name_locked |
+----------+-------+--------+-------------+
| aaa      | aaa   |      1 |           0 |
+----------+-------+--------+-------------+
1 row in set (0.00 sec)
#这个命令监控的是被表锁锁住的表,如果用行锁,这个命令是没有反应的


相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
2月前
|
缓存 关系型数据库 MySQL
MySQL索引策略与查询性能调优实战
在实际应用中,需要根据具体的业务需求和查询模式,综合运用索引策略和查询性能调优方法,不断地测试和优化,以提高MySQL数据库的查询性能。
196 66
|
9天前
|
存储 SQL 关系型数据库
【MySQL基础篇】MySQL约束语法
文章介绍了MySQL中表的约束概念,包括非空、唯一、主键、默认和外键约束,以及如何在创建和修改表时指定这些约束。外键约束用于保持数据的一致性和完整性,文章通过示例展示了添加、删除外键的语法,并讨论了不同的删除/更新行为,如CASCADE和SETNULL。
【MySQL基础篇】MySQL约束语法
|
13天前
|
存储 Oracle 关系型数据库
索引在手,查询无忧:MySQL索引简介
MySQL 是一款广泛使用的关系型数据库管理系统,在2024年5月的DB-Engines排名中得分1084,仅次于Oracle。本文介绍MySQL索引的工作原理和类型,包括B+Tree、Hash、Full-text索引,以及主键、唯一、普通索引等,帮助开发者优化查询性能。索引类似于图书馆的分类系统,能快速定位数据行,极大提高检索效率。
48 8
|
16天前
|
SQL 关系型数据库 MySQL
MySQL 窗口函数详解:分析性查询的强大工具
MySQL 窗口函数从 8.0 版本开始支持,提供了一种灵活的方式处理 SQL 查询中的数据。无需分组即可对行集进行分析,常用于计算排名、累计和、移动平均值等。基本语法包括 `function_name([arguments]) OVER ([PARTITION BY columns] [ORDER BY columns] [frame_clause])`,常见函数有 `ROW_NUMBER()`, `RANK()`, `DENSE_RANK()`, `SUM()`, `AVG()` 等。窗口框架定义了计算聚合值时应包含的行。适用于复杂数据操作和分析报告。
58 11
|
20天前
|
存储 关系型数据库 MySQL
mysql怎么查询longblob类型数据的大小
通过本文的介绍,希望您能深入理解如何查询MySQL中 `LONG BLOB`类型数据的大小,并结合优化技术提升查询性能,以满足实际业务需求。
79 6
|
8天前
|
存储 关系型数据库 MySQL
MySQL(条件约束)
为了校验数据,让数据的正确性能够得到保证,约束,能够引进更多的检查操作,但是也会增加系统的成本开销
|
2月前
|
关系型数据库 MySQL 网络安全
DBeaver连接MySQL提示Access denied for user ‘‘@‘ip‘ (using password: YES)
“Access denied for user ''@'ip' (using password: YES)”错误通常与MySQL用户权限配置或网络设置有关。通过检查并正确配置用户名和密码、用户权限、MySQL配置文件及防火墙设置,可以有效解决此问题。希望本文能帮助您成功连接MySQL数据库。
73 4
|
2月前
|
关系型数据库 MySQL 数据处理
MySQL函数与约束
MySQL 提供了丰富的函数和强大的约束机制,用于数据处理和完整性维护。通过掌握这些工具,可以有效地管理和分析数据库中的数据,确保数据的一致性和准确性。无论是在日常数据查询中使用内置函数,还是在数据库设计中应用各种约束,都是确保数据库系统稳定、高效运行的关键。希望本文对您理解和应用 MySQL 函数与约束有所帮助。
36 1
|
11天前
|
存储 Oracle 关系型数据库
数据库传奇:MySQL创世之父的两千金My、Maria
《数据库传奇:MySQL创世之父的两千金My、Maria》介绍了MySQL的发展历程及其分支MariaDB。MySQL由Michael Widenius等人于1994年创建,现归Oracle所有,广泛应用于阿里巴巴、腾讯等企业。2009年,Widenius因担心Oracle收购影响MySQL的开源性,创建了MariaDB,提供额外功能和改进。维基百科、Google等已逐步替换为MariaDB,以确保更好的性能和社区支持。掌握MariaDB作为备用方案,对未来发展至关重要。
38 3
|
11天前
|
安全 关系型数据库 MySQL
MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!
《MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!》介绍了MySQL中的三种关键日志:二进制日志(Binary Log)、重做日志(Redo Log)和撤销日志(Undo Log)。这些日志确保了数据库的ACID特性,即原子性、一致性、隔离性和持久性。Redo Log记录数据页的物理修改,保证事务持久性;Undo Log记录事务的逆操作,支持回滚和多版本并发控制(MVCC)。文章还详细对比了InnoDB和MyISAM存储引擎在事务支持、锁定机制、并发性等方面的差异,强调了InnoDB在高并发和事务处理中的优势。通过这些机制,MySQL能够在事务执行、崩溃和恢复过程中保持
38 3