MySQL事务与存储引擎的学习(一)
一、MySQL事务
1.1、什么是MySQL事务?
是用户定义的,将多条命令打包,在服务端执行,要么全部执行,要么全部不执行。保证不会被其他命令加塞,打断。
MySQL当中的事务是自动执行的,默认情况下,每条SQL语句执行完成以后都会自动提交事务。
1.2、手动控制事务
-
- 查看/设置事务的提交方式
SELECT @@autocommit; -- 查看事务的提交方式,1表示自动提交,0表示手动提交
SET @@autocommit = 0; -- 设置事务的提交方式为手动提交
-
- 提交事务
-- 执行完事务后,如果要提交事务,使用COMMIT语句
COMMIT;
-
- 回滚事务
-- 如果执行完事务后,发现执行的事务有问题,想要撤销事务,使用ROLLBACK语句
ROLLBACK;
1.3、自动控制事务
-
- 开启事务
START TRANSACTION OR BEGIN; -- 显式地开启一个事务
-
- 提交事务
COMMIT;
-
- 回滚事务
ROLLBACK;
1.4、事务的特性(ACID)
- 原子性(Automicity):事务是最小的执行单位,不允许分割,要么全部成功,要么全部失败
- 一致性(Consistency):事务完成时,所有数据都必须处于一致状态
- 隔离性(Isolation):数据库系统提供一定的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行
- 持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的
1.5、并发事务处理可能遇到的问题
问题 | 描述 |
---|---|
脏读(Dirty Read) | 一个事务在处理过程中读取了另一个未提交的事务中的数据 |
不可重复读 | 一个事务先后读取同一条记录,但两次读取的数据不同,称为不可重复读 |
幻读 | 一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已经存在,好像出现了“幻影” |
1.6、事务的隔离级别(为了解决并发事务遇到的问题)
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
读未提交(Read Uncommitted) | 可能发生 | 可能发生 | 可能发生 |
读已提交(Read Committed) | 不可能发生 | 可能发生 | 可能发生 |
可重复读(Repeatable Read–MySQL默认级别) | 不可能发生 | 不可能发生 | 可能发生 |
串行化(Serializable) | 不可能发生 | 不可能发生 | 不可能发生 |
注意:
- 隔离级别从小到大,安全性越高,效率越低,串行化级别效率最低,但是安全性最高
1.7、查看/设置事务的隔离级别
SELECT @@transaction_isolation; -- 查看事务的隔离级别SET [SESSION|GLOBAL] TRANSACTION ISOLATION LEVEL 隔离级别{READ UNCOMMITTED|READ COMMITTED|REPEATABLE READ|SERIALIZABLE};
二、存储引擎
2.1、 体系结构
2.2、 存储引擎简介
是存储数据、建立索引、更新/查询数据等技术的实现方式。存储引擎是基于表而不是基于库的,所以存储引擎也可以被称为表引擎,即不同的表可以选择不同的存储引擎。
CREATE TABLE 表名(字段1 数据类型 [约束],...
) ENGINE=存储引擎名称; -- MySQL5.5以后的版本,默认存储引擎为InnoDB
2.3、查看当前数据库支持的存储引擎
SHOW ENGINES;
2.4、 存储引擎-InnoDB
- 介绍:InnoDB是一种兼顾高可靠性与高性能的通用存储引擎,在MySQL5.5以后版本中是默认的存储引擎。
- 特点:
-
- DML操作遵循ACID模型,支持事务安全(具有事务,回滚,并发控制)
-
- 行级锁,提高并发访问性能
-
- 支持外键,保证数据的完整性和正确性
- 文件:xxx.ibd,InnoDB引擎的每张表都会对应一个表空间文件,存储该表的表结构(frm、sdi)、数据和索引,参数:innodb_file_per_table
-- 查看参数是否开启 SHOW VARIABLES LIKE 'innodb_file_per_table';
# 查看idb文件 idb2sdi xxx.ibd
-
- 逻辑存储结构
2.5、存储引擎-MyISAM
- 介绍:MyISAM是MySQL早期的默认存储引擎
- 特点:
-
- 不支持事务,不支持外键
-
- 支持表锁,不支持行锁
-
- 访问速度快
- 文件:
- xxx.sdi:存储表结构信息
- xxx.MYD:存储数据
- xxx.MYI:存储索引
-
2.6、存储引擎-Memory
- 介绍:Memory引擎的表数据是存储在内存中的,因此速度快,但是不安全,一旦MySQL服务关闭,所有的数据都会丢失
- 特点:
-
- 存储内容全部放在内存中,速度快
-
- hash索引(默认)
- 文件:
- xxx.sdi:存储表结构信息
-
2.7、存储引擎的选择(常用还是InnoDB)
- InnoDB:是MySQL的默认引擎,支持事务、外键,如果应用对事务的完整性有比较高的要求,在并发条件下要求数据的一致性,数据操作除了插入和查询之外,还包含很多的更新、删除操作,那么InnoDB是最好的选择。
- MyISAM: 如果应用是以读操作和插入操作为主,只有很少的更新和删除操作,并且对事务的完整性、并发性要求不高,那么选择MyISAM是非常合适的。NoSQL数据库替代
- MEMORY: 将所有数据保存在内存中,速度快,通常用于临时表及缓存、MEMORY的缺陷就是对于表的大小有限制,太大的表无法缓存在内存中,而且如果mysqld服务关闭了,那么所有的数据都会丢失。Redis替代
三、总结:
3.1、MySQL的事务与Redis的事务比较
MySQL | Redis | |
---|---|---|
事务支持 | 支持(默认开启) | 支持(需手动控制) |
回滚事务 | 支持 | 不支持 |
ACID | 支持 | 支持 |