1. 事务

定义

事务也是在存储引擎层实现的,可以这么说,事务本质就是一组SQL语句,但是这些SQL语句要么全部执行,要么都不执行。
为了保证数据完整性,数据库系统必须维护下面四个性质(即ACID):

  • 原子性:一个事务是不可分割的,要么事务中的SQL语句全部成功提交,要么全部回滚。
  • 一致性:数据库从一个一致的状态转移到另一个一致的状态,前后数据库的完整性没有被破坏。
  • 隔离性:多个事务并发访问时,事务之间是隔离的,一个事务不应该影响其它事务运行。数据库系统中有4种隔离级别。
  • 持久性:事务提交后,所做的修改会一直保存在数据库中。

SQL语句

MySQL中开始一个事务并提交的过程如下:

1
2
3
4
START TRANSACTION;
SELECT * FROM user;
DELETE FROM user;
COMMIT;

如果想回滚来撤销开始事务之后的SQL语句可以使用ROLLBACK,不过不可以撤销SELECT、CREATE、DROP的操作。

隔离级别

事务的隔离性一共有4个隔离级别

  • READ UNCOMMITTED(未提交读):对事务的修改即使还未提交,对其他事务也是可见的,即可以读取未提交的数据,会出现脏读的情况。

  • READ COMMITTED(提交读):事务从开始到提交前所做的修改对其他事务是不可见的,但是执行同样的查询可能会出现不一样的结果,所以也叫不可重复读

  • REPEATABLE READ(可重复读):可重复读是MySQL事务的默认隔离级别,它解决了脏读的问题,并且保证执行同样的查询的结果相同。

  • SERIALIZABLE(可串行化):强制事务串行执行,数据一致性好,但会导致大量锁竞争的问题,并发性弱。

ANSI SQL隔离级别

隔离级别 脏读可能性 不可重复读可能性 幻读可能性 加锁读
READ UNCOMMITTED(未提交读)
READ COMMITTED(提交读)
REPEATABLE READ(可重复读)
SERIALIZABLE(可串行化)

幻读

幻读是指当某个事物前后执行两条SQL查询语句查询记录,发现前后查询的记录不一致,这时可能其他事务在两次查询之间插入了新记录。MySQL的InnoDB存储引擎通过多版本并发控制(MVCC)解决了幻读问题。

2. 范式

范式是关系数据库理论的基础,也是在设计数据库结构过程中所要遵循的规则和指导方法。目前共有8种范式:1NF,2NF,3NF,BCNF,4NF,5NF,DKNF,6NF。通常所用到的基本是前三个范式:

第一范式(1NF)

第一范式指的是字段的原子性,即字段不可再分,但这取决于所面临的场景,如姓名这个字段其实可以分为姓氏和名字。

第二范式(2NF)

第二范式要求要有主键约束,即每一条记录都是唯一的,并且其他字段完全依赖于主键。

第三范式(3NF)

第三范式即消除传递依赖,非主键字段直接依赖于主键字段。例如在学生表中存在学号、姓名、年龄等字段,其中主键为学号,这时所有非主键字段都直接依赖于学号,这时如果将系编号、系别、系主任加到学生表中就出现传递依赖了,具体就是系别、系主任直接依赖与系编号,而系编号依赖于主键,这时应该通过拆分形成学生表和系别表从而消除传递依赖。

3. 索引

索引之于数据库犹如目录之于书籍,在MySQL中,索引在存储引擎层实现,索引可以用于快速查找到特定的记录。索引是存储某列或某几列字段的数据结构,这种数据结构有多种实现方式,如:B树、B+树、哈希表,在MySQL中的默认存储引擎InnoDB默认使用B+树来实现索引。

4. 存储引擎

查看当前支持的存储引擎
1
show engines
更改表使用的存储引擎
1
ALTER TABLE my_table ENGINE=InnoDB

InnoDB

MySQL默认的存储引擎就是InnoDB,它具有以下特性:

  • 事务
  • 行级锁

*