MySQL复习-事务,引擎锁,锁
1. 事务
事务是一组操作集合,他是不可分割的工作单位,事务会把所有操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。
1.1 事务的四大特征
- 原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败。
- 一致性(Consistency):事务完成时,必须使所有的数据都保持一致。
- 隔离性(Isolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境中运行。
- 持久性(Durablility):事务一旦提交或回滚,他对数据库中的数据的改变就是永久的。
鄙人粗浅的理解:
- 原子性就是事务是一个整体,不可会出现一条命令的一半执行了另一半没有执行吧
- 一致性就是所有的sql都必须执行成功,成功了才提交,失败了就回滚,数据的变化才是一致的
- 隔离性就是事务A不会被事务B影响
1.2 并发事务的问题
- 脏读
事务A读取到了事务B还没有提交的数据 - 幻读
事务A按照条件查询数据时,没有对应的数据行,但是插入数据时,却发现这行数据已经存在。 - 不可重复度
事务A先后读取同一条记录,但两次读取的数据不同
1.3 事务的隔离级别
- Read Uncommitted 都会出现
- Read Committed 会出现幻读和不可重复读
- Repeatable Read(默认) 会出现幻读
- Serializable 都不会出现
2. 存储引擎
存储引擎就是存储数据、建立索引、更新/查询数据等技术的实现方式。存储引擎是基于表的,而不是基于库的,所以存储引擎也可以被称为表类型。
下面介绍常用的三种常用的存储引擎
- InnoDB
先版本InnoDB是默认的MySQL存储引擎
特点:
- 支持事务
- 可以使用行锁
- 支持外键
每张表都会对应一个表空间文件(.ibd),存储该表的表结构、数据和索引
逻辑存储结构:
TableSpace 表空间
Segement 段
Extent 区(1M)
Page 页(16kb) 存储引擎磁盘管理的最小单位
Row 行
col 列
- MyISAM
早期MySQL默认的存储引擎
特点:
- 不支持事务
- 不支持行锁
- 不支持外键
- 访问速度快
文件有.sdi、.MYD、.MYI
- Memory
Memory引擎的表数据时存储在内存中的,由于受到硬件问题、或断电问题的影响,只能将这些表作为临时表或缓存使用
特点:
- 内存存放
- hash索引
文件有.sdi
- 存储引擎的选择
InnoDB: 是Mysql的默认存储引擎,支持事务、外键。如果应用对事务的完整性有比较高的要求,在并发条件下要求数据的一致性,数据操作除了插入和查询之外,还包含很多的更新、删除操作,那么InnoDB存储引擎是比较合适的选择。
MyISAM : 如果应用是以读操作和插入操作为主,只有很少的更新和删除操作,并且对事务的完整性、并发性要求不是很高,那么选择这个存储引擎是非常合适的。
MEMORY:将所有数据保存在内存中,访问速度快,通常用于临时表及缓存。MEMORY的缺陷就是对表的大小有限制,太大的表无法缓存在内存中,而且无法保障数据的安全性。
3. 锁
全局锁:锁定数据库中的所有表。
加锁后整个实例处于只读状态
表级锁:每次操作锁住整张表。
表锁:
读锁:可读不可写
写锁:对应客户端可以读写,其他不能读也不能写
元数据锁:
为了避免dml和ddl冲突
意向锁:
避免dml与行锁的冲突
行级锁:每次操作锁住对应的行数据。
行锁:锁单条记录
间隙锁:缩间隙(不含记录)
临键锁:行锁和间隙锁的组合