本系列学习笔记旨在作者准备数据库方面面试用,有点临阵磨枪的感觉,我学习MySQL是参考的掘金小册的《MySQL 是怎样运行的:从根儿上理解 MySQL》和《MySQL 是怎样使用的:从零蛋开始学习 MySQL》,学习笔记里将核心概念和高频考点总结一下,图都是从小册里摘取的,如果涉及侵权可随时撤销,如果大家是零基础学习MySQL,强烈推荐上面的两本小册。
1、什么是事务?
数据库将现实世界里的对数据的操作(比如取钱、存钱等)映射到数据库的事务中,事务(transcation)就是一个或者多个数据库的操作,这些操作满足事务的四大特性。
1.1 事务的状态
事务的状态有以下5种:
- 活动的(active)
- 部分提交的(partially committed)
- 失败的(failed)
- 中止的(aborted)
- 提交的(committed)
下面具体介绍事务的5种状态。
(1)活动的(active)
事务对应的数据库操作正在执行过程中,此时事务处于活动的状态。
(2)部分提交的(partially committed)
事务对应的一些列数据库的操作已经执行完毕,还没有将执行结果从数据库刷新到磁盘中,此时事务处于部分提交的状态。
(3)失败的(failed)
当事务处在活动的或者部分提交的状态时,可能遇到了某些错误(数据库自身错误、操作系统错误或者节点下电了)而无法继续执行,或者人为停止当前事务的执行,此时事务处于失败的状态。
(4)中止的(aborted)
数据库状态变为失败的状态时,会进行回滚操作,即将数据库恢复到事务执行前的状态,回滚后事务处于中止的状态。
(5)提交的(committed)
当一个处在部分提交的状态的事务将事务执行的结果从内存刷新到磁盘后,此时事务处于提交的状态。
状态转移图如下,图摘自链接1。
1.2 事务相关的基本sql语句
开启事务
BEGIN[WORK]
... 这里执行事务包含的数据库操作的sql语句
提交事务
COMMIT[WORK]
举个例子:
mysql> BEGIN;
Query OK, 0 rows affected (0.00 sec)
mysql> UPDATE account SET balance = balance - 10 WHERE id = 1;
Query OK, 1 row affected (0.02 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> UPDATE account SET balance = balance + 10 WHERE id = 2;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> COMMIT;
Query OK, 0 rows affected (0.00 sec)
1.3 MySql支持事务的存储引擎
MySQL常见的额存储引擎有InnoDB、MyISAM和Memory等,目前只