一、
MySQL常用的存储引擎主要有两种:MylSAM 和InnoDB
MylSAM:
1、不支持事务管理 (最新版本好像也支持事务管理了),但是每次查询操作是原子的
2、支持表锁,每次操作都是对整张表进行加锁
3、存储所有行数
4、一个MylSAM表有三个文件:索引文件、表结构文件、数据文件
5、采用非聚集式索引:辅索引和主索引基本一致,但是辅索引不保证唯一性
InnoDB:
1、支持ACID的事务管理 支持事务的四种隔离级别
2、支持行锁,支持写并发
3、不存储所有行数
4、一个InnoDB引擎存储在一个或者·多个文件中,受操作系统文件大小的限制
5、采用聚集式索引,辅索引的数据域存储主键的值,从辅索引查找数据时,需要先通过辅索引查找到主键值,再访问辅索引
二、什么是事务
事务就是要么都成功要么都失败。
事务有一个原则:ACID
ACID:原子性、一致性、隔离性、持久性
原子性:一个事务中的操作要么都成功要么都失败
一致性:事务前后数据的完整性保持一致
隔离性:一个事务再提交之前对于其他事务来说是不可见的
持久性:事务一旦提交是不可逆的,事务一旦提交他对数据库进行的操作会被永久的保存到数据库中(如果出现错误,事务没有提交就恢复到原状,事务已经提交,就持久化到数据库不会变了)
事务的四种隔离级别:
read uncommit:读未提交(也叫脏读)可能会读到其他事务未提交的数据
read commit:读已提交,(一个事务内读同一行数据)两次读取结果不一致叫做不可重复读,只读取已经提交事务的数据,可以避免脏读的发生(不一定是错误,只是某些场合不适用(就是他这个事务执行过程中,其他事务进行了提交导致数据变化))
repeatable read:可重复读,这是sql的默认级别,就是每次读取结果都相同 (但是可能出现幻读的情况,在一个事务内读取到了别的事务插入的数据,导致前后读取不一致)
serializable:串行 一般不使用 他会给每一行读取的数据加锁,会导致大量超时和锁竞争的问题。
例子:
set autocommit =0 //关闭事务的自动提交
set autocommit = 1 //开启事务的自动提交 默认是开启的
start TRANSACTION --- 标记一个事务的开始,从这个以后得sql都在同一个事务内
commit ---事务提交
ROLLBACK --出现错误回滚
SET autocommit =1 ---事务结束开启事务的自动提交
SAVEPOINT 保存点名 --- 设置一个事务的保存点
ROLLBACK TO 保存点名 --回滚到保存点
RELEASE SAVEPOINT ----保存点名 删除保存点