前言:
MySQL常见引擎有哪些?
MyIsam和InnoDB对比?
什么是事务?
常见的引擎:1、MyIsam , 2、 InnoDB, 3、 Memory, 4、 Blackhole, 5、CSV, 6、Performance_Schema, 7、Archive, 8、 Federated , 9、 Mrg_Myisam
在MySQL5.5.5版本之前默认的是MyISAM,MySQL5.5.5版本之后默认的是InnoDB,实际开发中根据项目需求使用最多的是MyISAM和InnoDB。
这里介绍的是MyIsam和InnoDB,其余的可以自己下去了解,在说MyIsam和InnoDB区别之前,先要说一下事务。
什么是事务:
由一步或几步数据库操作序列组成逻辑执行单元,这系列操作要么全部执行,要么全部放弃执行
事务的特性(ACID)
原子性(Atomicity):应用中的最小执行单位,不可再分
一致性(Consistency):执行一个操作要么全部成功,要么全部失败,不会有第三种情况。
隔离性(Isolation):各事务之间的执行各不影响,都是隔离开来的。
持久性(Durability):一旦提交,对数据的任何改变都将永久记录下来,存进了我们的物理磁盘中。
事务的处理方式有两种:
1、BEGIN, ROLLBACK, COMMIT
begin:开启事务
rollback:事务回滚
commit:提交事务
2、通过set改变mysql的自动提交模式
MySQL默认的是自动提交模式,提交一个query就直接执行通过。
set autocommit = 0 禁止自动提交
set autocommit = 1 开启自动提交
事务的隔离级别:读未提取、读提取、重复度、序列化
读未提取:一个事务可以读取另一个未提交事务的数据(千篇一律的案例:老板要给程序员发工资,程序员的工资是3.6万/月。但是发工资时老板不小心按错了数字,按成3.9万/月,该钱已经打到程序员的户口,但是事务还没有提交,就在这时,程序员去查看自己这个月的工资,发现比往常多了3千元,以为涨工资了非常高兴。但是老板及时发现了不对,马上回滚差点就提交了的事务,将数字改成3.6万再提交。分析:实际程序员这个月的工资还是3.6万,但是程序员看到的是3.9万。他看到的是老板还没提交事务时的数据。这就是脏读),使用读未提取可以解决脏读问题。
读提取:一个事务要等另外一个事务提交之后才能够读取数据(千篇一律才案例:程序员拿着信用卡去享受生活(卡里当然是只有3.6万),当他买单时(程序员事务开启),收费系统事先检测到他的卡里有3.6万,就在这个时候!!程序员的妻子要把钱全部转出充当家用,并提交。当收费系统准备扣款时,再检测卡里的金额,发现已经没钱了(第二次检测金额当然要等待妻子转出金额事务提交完)。程序员就会很郁闷,明明卡里是有钱的…分析:这就是读提交,若有事务对数据进行更新(UPDATE)操作时,读操作事务要等待这个更新操作事务提交后才能读取数据,可以解决脏读问题。但在这个事例中,出现了一个事务范围内两个相同的查询却返回了不同数据,这就是不可重复读),解决这个问题使用的就是第三种重复读。
重复读:开始读取数据时,不再允许修改操作(经典小案例:程序员拿着信用卡去享受生活(卡里当然是只有3.6万),当他埋单时(事务开启,不允许其他事务的UPDATE修改操作),收费系统事先检测到他的卡里有3.6万。这个时候他的妻子不能转出金额了。接下来收费系统就可以扣款了。分析:重复读可以解决不可重复读问题。写到这里,应该明白的一点就是,不可重复读对应的是修改,即UPDATE操作。但是可能还会有幻读问题。因为幻读问题对应的是插入INSERT操作,而不是UPDATE操作。)
幻读:是隔离级别最高的,再该级别下事务串行化执行,可以避免脏读、不可重复读、幻读,但是效率低,消耗数据库的性能(根据项目实际情况选择合适的技术)
MyISAM:不支持事务,表级锁,支持全文索引
InnoDB:支持事务,行级锁
InnoDB是使用B+树