事务:MySQL 事务主要用于处理操作量大,复杂度高的数据。简单来说,事务就是一组SQL语句的集合
事务的四个特性(ACID):
原子性(Atomicity,或称不可分割性):一个事务中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚到事务开始前的状态。
一致性(Consistency):在事务开始之前和事务结束以后,数据库的完整性没有被破坏。简单来说,一致性指数据处于一种语义上的有意义且正确的状态;一致性是对数据可见性的约束,保证在一个事务中的多次操作的数据中间状态对其他事务不可见的
隔离性(Isolation,又称独立性):数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)
持久性(Durability):事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
事务的原子性:指事务在执行时,执行的结果要么全部成功,要么全部失败;
事务的开启命令,当事务commit(提交之后),将所有语句执行;rollback将所有语句撤销;
开启一个事务后,错误的语句会被分析器过滤掉,当commit时对于MySQL来说只有正确的语句,所以在捕捉到异常的时候应当将事务显示的rollback而不是commit。
事务的一致性:一致性是对数据可见性的约束,保证在一个事务中的多次操作的数据中间状态对其他事务不可见的
例子:A给B转账1000元,A的钱减少了1000,B的钱增加了1000,一致性指C只会看到A转账前的状态或B收账后的状态,不会观察到中间的状态
一致性与原子性的侧重点不同:原子性关注的是状态,即上述的转账成功或者失败,而一致性关注的是数据的可见性,即转账过程中数据的转移,中间的转账数据不可见,只有转账前的数据和转账后的数据是可见的
事务的隔离性:为了防止多个事务并发执行时由于交叉执行而导致数据的不一致;
事务的隔离级别从低到高为1.未提交读(脏读、不可重复读、幻读) 2.已提交读 (不可重复读、幻读)3.可重复读 (幻读) 4.可串行化
隔离性的作用:
1.脏读(可通过已提交读解决)
事务A修改了一个数据,但未提交,事务B读到了事务A未提交的更新结果,如果事务A提交失败,事务B读到的就是脏数据
2.不可重复读(事务的并发修改记录造成的,通过对修改的记录加锁解决)
在同一个事务中,对于同一份数据读取到的结果不一致。比如,事务B在事务A提交前读到的结果,和提交后读到的结果可能不同
3.幻读(并发增添记录导致)
在同一个事务中,同一个查询多次返回的结果不一致。事务A新增了一条记录,事务B在事务A提交前后各执行了一次查询操作,发现后一次比前一次多了一条记录
事务的持久性:数据的修改是永久的
索引:索引,在关系数据库中,是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。
MYISAM(连接称会话): 是一种基于B+树、非聚集索引的存储引擎
数据与索引分离开来,B+树的叶子节点为数据的地址
简易画法,大概意思到了就行,O(∩_∩)O~~
从图中可以看出,叶子结点存放的地址,根据地址可以找到对应的数据,存储数据的地址可以不连续
加的锁是表锁;表锁:1.读锁 共享读锁,兼容其他的读锁
2.写锁 独占写锁,不兼容其他的写锁
主索引;key不能重复
辅助索引:key可以重复,叶子结点存储数据地址
InnoDB(连接称事务):是一种基于B+树、聚集索引的存储引擎
索引是数据的一部分,叶子结点存储的是真实的数据
加的锁是行锁,行锁加在主索引上则为行锁,若不是加在主索引上则加的是表锁
1.读锁 共享锁
2.写锁 排他锁 排斥其他所有的锁
判断是否应该建索引的条件
1、较频繁的作为查询条件的字段应该创建索引
2、唯一性太差的字段不适合单独创建索引,即使频繁作为查询条件
3、增、删、改操作较多的数据库字段不适合建索引