事务特性 ACID
原子性能保证一个事务完全执行或完全不执行,隔离性能保证事务并发执行不出错,持久性能保证写入的数据都是有效的,他们三个可以保证一致性
其中事务的隔离性与隔离级别是为了保证并发执行时不出异常,并发执行可能出现的异常有 脏写(一个事务修改的另一个未提交事务修改过的数据) 脏读(读到未提交事务写入的数据) 不可重复读(一个事务修改了另一个事务读取的数据) 幻读(一个事务根据筛选条件选出一些记录,事务未提交时,另一个事务写入了一些符合条件的记录),Mysql 默认隔离级别 REPEATABLE READ 即可防止前三种情况不会出现,幻读可能发生。
锁与MVCC
Mysql为了实现事务的隔离性,使用了锁与MVCC这两种机制,写-写的情况下会使用锁,读-写 写-读的情况下会使用MVCC,其中锁还分为行锁和表锁(InnoDB只有在通过索引条件检索数据时使用行级锁,否则使用表锁。InnoDB的行锁是针对索引加的锁,不是针对记录加的锁。并且该索引不能失效,否则都会从行锁升级为表锁)
索引
最左前缀匹配原则,非常重要的原则,mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配,比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到,a,b,d的顺序可以任意调整。
非聚簇索引
表数据和索引是分成两部分存储的,主键索引和二级索引存储上没有任何区别
聚簇索引
表数据是和主键一起存储的,主键索引的叶结点存储行数据(包含了主键值),二级索引的叶结点存储行的主键值
InnoDB 主键使用的是聚簇索引,MyISAM 不管是主键索引,还是二级索引使用的都是非聚簇索引。
redo undo binlog 日志
redo 日志记录历史操作,保证不会发生内存失效导致已提交的事物写不到磁盘上的情况,如果每次都刷磁盘成本过高,所以会有操作记录日志
undo 日志记录每次操作需要回滚的内容,用于异常时回滚,比如:在插入一条记录时,至少要把这条记录的主键值记下来,在删除一条记录时,至少要把这条记录中的内容都记下来
binlog 日志 MySQL 重要 log,二进制日志文件,记录所有 DDL 和 DML 语句(除select),事件形式记录,包含语句所执行的消耗时间,事务安全型。
spring事务传播
默认 REQUIRED:如果当前没有事务,则自己新建一个事务,如果当前存在事务,则加入这个事务
SUPPORTS:当前存在事务,则加入当前事务,如果当前没有事务,就以非事务方法执行
MANDATORY:当前存在事务,则加入当前事务,如果当前事务不存在,则抛出异常。
REQUIRES_NEW:创建一个新事务,如果存在当前事务,则挂起该事务。
NOT_SUPPORTED:始终以非事务方式执行,如果当前存在事务,则挂起当前事务。
NEVER:不使用事务,如果当前事务存在,则抛出异常。
NESTED:如果当前事务存在,则在嵌套事务中执行,否则REQUIRED的操作一样(开启一个事务)。
其他知识
DDL(数据库定义语言),主要命令有create、alter、drop等。DDL主要定义或改变表table的结构、数据类型。建表时使用。
MDL(数据操纵语言),主要命令有select、update、insert、delete。