文章目录
1 存储引擎
1-1 存储引擎的使用
- 数据库中的各表均被(在创建表时)指定的存储引擎处理
- 服务器可用的引擎依赖于以下因素
- mysql的版本
- 服务器在开发时如何被配置
- 启动选项
- 为了解当前服务器中有哪些存储引擎可用,可使用
show engines;
语句
mysql> show engines;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine | Support | Comment | Transactions | XA | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES | YES | YES |
| MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO |
| MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO |
| BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO |
| MyISAM | YES | MyISAM storage engine | NO | NO | NO |
| CSV | YES | CSV storage engine | NO | NO | NO |
| ARCHIVE | YES | Archive storage engine | NO | NO | NO |
| PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO |
| FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
9 rows in set (0.00 sec)
注意:完整的建表语句
create table <表名> (
<字段> [类型] (约束),
)engines = <存储引擎> default charset = utf-8;
查询存储引擎
show engines;
2 常见的存储引擎
2-1 mytsam------mysql最常见的引擎—但不是默认的
-
管理的表具有以下特征
-
使用三个文件表示表
- 格式文件-存储表结构的定义(.frm)
- 数据文件-存储表行的内容(.MYD)
- 索引文件-存储表上的索引(.MYI)
-
灵活的auto_increment字段处理
-
可被转换为压缩,只读来节省空间
-
-
不支持事务
2-2 inondb-------mysql默认存储引擎
-
支持事务
-
最安全
-
行级锁、外键
-
处理速度较快的
2-3 memory
- 不支持事务,数据容易丢失,因为数据、索引都是存储在内存当中的
- 查询速度最快
3 事务(transaction)
3-1 事务概述
-
一个事务是一个完整的业务逻辑单元,不可再分。
-
要想保证两条DML语句同时成功或者同时失败,那么就需要使用数据库的事务机制
-
事务只针对dml命令(insert delete updata)
3-2 事务的原理
一个事务可以一个业务功能,可以由多个dml指令构成
创建一个事务
开始事务机制
执行事务操作
提交事务或者回滚事务(commit rollback)savapoint(事务保存节点)
类似于git工具的代码存储暂存区可以提交,可以回转历史版本
3-3 事务的三大特性
- 原子性-----A
事务时最小的工作单元,不可再分
- 一致性------C
事务必须保证多条dml语句同时成功或者同时失败
- 隔离性------I
事务a与事务b之间具有隔离
- 持久性------D
持久性说的是最终的数据必须持久化到硬盘文件中,事务才算是成功的结束
3-4 关于事务的隔离性
事务的隔离性存在隔离级别,理论上隔离级别包括4个:
- 第一级别:
读未提交
(read uncommitted)
对方事务还没有提交,我们当前事务可以读取到对方未提交的数据
读未提交存在脏读现象
,表示读到了脏的数据
当事务还没有提交时,读取读到的是缓存中的数据,因为可以回滚和删除,这导致事务读取的极其不稳定
-
第二级别:
读已提交
(read commitied) 对方的事务提交之后的数据我们可以读取到。
解决了脏读问题
存在问题:不可重复读。
-
第三阶段:
可重复读
(repeatable read) 解决了不可重复读的问题
存在问题:读到的数据都是事务开启时的数据
-
第四级别:
序列化/串行化读
解决了所有问题
效率低。需要事务排队
一个事务未完成之前第二个事务是无法开启的
演示事务
-
MySQL事务在默认情况下是自动提交的。
(自动提交?只要执行任意一条dml语句则提交一次)
关闭自动提交?
start transaction;
mysql> select *from t_transcation;
+----+------+
| id | name |
+----+------+
| 1 | lisi |
+----+------+
1 row in set (0.00 sec)
mysql> rollback;
Query OK, 0 rows affected (0.00 sec)
mysql> select*from t_transcation;
+----+------+
| id | name |
+----+------+
| 1 | lisi |
+----+------+
1 row in set (0.00 sec)
因为mysql默认执行一句dml就提交一次,所以回滚是回不到之前的状态
开启自动提交
mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)
事务未提交时是可以回滚的
mysql> insert into t_transcation (name) values("tom");
Query OK, 1 row affected (0.00 sec)
mysql> select * from t_transcation;
+----+------+
| id | name |
+----+------+
| 1 | lisi |
| 2 | tom |
+----+------+
2 rows in set (0.00 sec)
mysql> rollback;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from t_transcation;
+----+------+
| id | name |
+----+------+
| 1 | lisi |
+----+------+
1 row in set (0.00 sec)
提交事务
mysql> insert into t_transcation(name) values ("tom");
Query OK, 1 row affected (0.00 sec)
mysql> commit;
Query OK, 0 rows affected (0.00 sec)
mysql> rollback;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from t_transcation;
+----+------+
| id | name |
+----+------+
| 1 | lisi |
| 3 | tom |
+----+------+
2 rows in set (0.00 sec)
注意
:回滚事务之只能回到事务开始时的状态 且回滚后主键的值也会改变