思维索引:事务-->隔离级别(事务的I特性)-->存储引擎-->数据库索引的工作原理
事务:一般指的是要做的或者所做的事情,在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元,计算机术语中的事务通常指的就是数据库事务。
数据库事务的特性:(ACID)
(1)原子性 Atomicity:指的是事务包含的操作要么全部成功,要么全部失败回滚;因此事务的操作如果成功就必须完全应用到数据库,否则不能对数据库有任何的影响。
(2)一致性 Consistency: 一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,即事务执行之前和执行之后都必须处于一致性状态。借鉴的一个经典的例子:比如转账操作:现在有A和B两个账户,转账之前两个账户总的金额是6000,那么无论经过多少次转账,两个账户金额之和都应该是6000,这体现的就是一致性。<即数据库中的事务满足完整性约束>
(3)隔离性 Isolation: 隔离性指当多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能够被其他的事务所干扰。比如任何两个事务T1和T2,从事务T1的角度来看,T2要么在T1未开始之前就已经结束,要么在T1结束后才开始。<一个事务的执行不影响其它事务的执行>
(4)持久性 Durability: 指的是事务一旦提交,对数据库中数据的修改是永久性的,即使数据库系统遇到故障,也不会丢失提交事务的操作。
事务并发可能出现的问题:
1) 脏读:事务T1将某一值修改,事务T2在T1修改后读取了该值,之后由于某种原因,T1撤销了对该值的修改,则T2读取的是无效的数据。
2) 不可重复读:是指在数据库访问中,一个事务范围内两个相同的查询却返回了不同的数据。这是由于查询时系统中其他事务修改的提交引起的,比如事务T1读取某一数据,事务T2读取并修改了该数据,T1为了对读取值进行检验而再次读取该数据,便得到了不同的结果。
3) 幻读:幻读是指当事务不是同时执行时发生的现象,比如,事务T1对一个表中的数据进行了修改,比如这种修改涉及到表中的“所有数据行”,同时,事务T2也修改这个表中的数据,这种修改是向表中“添加一行新数据”。T1会发现表中还存在没有修改的数据,就好像产生了幻觉一样。
<以上内容来自摘自百科>
不可重复读和幻读:不可重复读侧重于修改,幻读侧重于删除和修改。
整理:(事物隔离级别)
Mysql数据库的事物隔离级别:
读未提交、读已提交、可重复度、串行化。
Mysql数据库的默认隔离级别是:可重复读 -->不会锁到读取到的行
读未提交:所有事物可以看到其它未提交事务的执行结果;本隔离级别很少用于实际应用,该级别引发的问题是---脏读(读取到了未提交的数据)。
读已提交:事务隔离级别为读已提交时,写数据只会锁住相应的行。
可重复读:事物隔离级别为可重复读时,如果有索引(包含主键索引)的时候,以索引列为条件更新数据,会存在间隙锁、行锁、下一键锁的问题,从而会锁住一些行。如果没有索引,更新数据时,会锁住整张表。
串行化:事务隔离级别为串行化时,会锁住整张表。
Mysql5.5以后默认的存储引擎是InnoDB,其中InnoDB和BDB提供事务安全表,其它存储引擎都是非事务安全表。可以通过修改mysql安装目录下的my.ini配置文件中的default-storage-engine来配置默认的存储引擎。
在mysql5.1以后,在information_schema数据库中的表ENGINES中存储了mysql数据库支持的存储引擎,和各引擎对事物的支持等特性。
MyIASM存储引擎不支持事务,也不支持外键,尤其是访问速度快、对事务完整性没有要求或者以select和insert为主的基本应用均可以使用这个引擎来创建表。
InnoDB存储引擎支持事务、外键等高级数据库功能。
Mysql中Memory引擎作为临时表,存放查询的中间结果(如果只是临时存放数据,数据量不大,并且不需要较高的数据安全性,可以选择将数据保存在内存中的Memory引擎中)
<------后续会继续完善------>