1. 事务

事务是一组操作集合,他是不可分割的工作单位,事务会把所有操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。

1.1 事务的四大特征

  • 原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败。
  • 一致性(Consistency):事务完成时,必须使所有的数据都保持一致。
  • 隔离性(Isolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境中运行。
  • 持久性(Durablility):事务一旦提交或回滚,他对数据库中的数据的改变就是永久的。

鄙人粗浅的理解:

  • 原子性就是事务是一个整体,不可会出现一条命令的一半执行了另一半没有执行吧
  • 一致性就是所有的sql都必须执行成功,成功了才提交,失败了就回滚,数据的变化才是一致的
  • 隔离性就是事务A不会被事务B影响

1.2 并发事务的问题

  1. 脏读
    事务A读取到了事务B还没有提交的数据
  2. 幻读
    事务A按照条件查询数据时,没有对应的数据行,但是插入数据时,却发现这行数据已经存在。
  3. 不可重复度
    事务A先后读取同一条记录,但两次读取的数据不同

1.3 事务的隔离级别

  1. Read Uncommitted 都会出现
  2. Read Committed 会出现幻读和不可重复读
  3. Repeatable Read(默认) 会出现幻读
  4. Serializable 都不会出现

2. 存储引擎

存储引擎就是存储数据、建立索引、更新/查询数据等技术的实现方式。存储引擎是基于表的,而不是基于库的,所以存储引擎也可以被称为表类型。

下面介绍常用的三种常用的存储引擎

  1. InnoDB

先版本InnoDB是默认的MySQL存储引擎

特点:

  • 支持事务
  • 可以使用行锁
  • 支持外键

每张表都会对应一个表空间文件(.ibd),存储该表的表结构、数据和索引

逻辑存储结构:

TableSpace 表空间
Segement 段
Extent 区(1M)
Page 页(16kb) 存储引擎磁盘管理的最小单位
Row 行
col 列

  1. MyISAM

早期MySQL默认的存储引擎

特点:

  • 不支持事务
  • 不支持行锁
  • 不支持外键
  • 访问速度快

文件有.sdi、.MYD、.MYI

  1. Memory

Memory引擎的表数据时存储在内存中的,由于受到硬件问题、或断电问题的影响,只能将这些表作为临时表或缓存使用

特点:

  • 内存存放
  • hash索引

文件有.sdi

  1. 存储引擎的选择

InnoDB: 是Mysql的默认存储引擎,支持事务、外键。如果应用对事务的完整性有比较高的要求,在并发条件下要求数据的一致性,数据操作除了插入和查询之外,还包含很多的更新、删除操作,那么InnoDB存储引擎是比较合适的选择。
MyISAM : 如果应用是以读操作和插入操作为主,只有很少的更新和删除操作,并且对事务的完整性、并发性要求不是很高,那么选择这个存储引擎是非常合适的。
MEMORY:将所有数据保存在内存中,访问速度快,通常用于临时表及缓存。MEMORY的缺陷就是对表的大小有限制,太大的表无法缓存在内存中,而且无法保障数据的安全性。

3. 锁

全局锁:锁定数据库中的所有表。
加锁后整个实例处于只读状态
表级锁:每次操作锁住整张表。
表锁:
读锁:可读不可写
写锁:对应客户端可以读写,其他不能读也不能写
元数据锁:
为了避免dml和ddl冲突
意向锁:
避免dml与行锁的冲突
行级锁:每次操作锁住对应的行数据。
行锁:锁单条记录
间隙锁:缩间隙(不含记录)
临键锁:行锁和间隙锁的组合