数据库基础复习之mysql事务、存储引擎

数据库引擎
InnoDB是MySQL默认的事务型存储引擎,其特点是行锁设计,支持多版本并发控制,支持外键,提供一致性非锁定读(是指InnoDB引擎通过MVCC的方式来读取当前执行时间数据库中行的数据,如果读取的行正在执行DELETE或UPDATE操作,这时读取操作不会等待行锁释放。相反,InnoDB会去读取行的一个快照数据,只有在需要InnoDB不支持的特性时,才考虑使用其它存储引擎。实现了四个标准的隔离级别,默认级别是可重复读(REPEATABLE READ)主索引是聚簇索引,在索引中保存了数据,从而避免直接读取磁盘,因此对查询性能有很大的提升
    MyISAM索引不支持事务,不支持行级锁,只支持表锁,读取时会对需要读到的所有表加共享锁,写入时则对表加排它锁。但在表有读取操作的同时,也可以往表中插入新的记录,这被称为并发插入。SELECT性能较高,适合执行查询较多的情况使用,MyISAM存储引擎记录表行数,所以在使用COUNT(*)时,只需取出存储的行数,而不用遍历表,效率较高。
    从MySQL5.1开始,MySQL引入插件式存储引擎体系结构。可以做到存储引擎层与SQL层更为独立,耦合更小,最重要的是方便了存储引擎的加载与移出,可以做到运行时加载新的存储引擎,而不影响MySQL正常运行。
封锁协议
一级:事务T修改数据R之前必须加X锁,事务结束后才能释放;
二级:在一级的基础上,T事务读取数据R时必须加S锁,读完就释放;
三级:和二级基本一样,只是S锁在事务提交后才释放。
1.事务特性
支持事务的目的:将数据库从一种一致性状态转变为另一种一致性状态。
ACID特性:
原子性(Atomicity):事务中包括的操作要么都做,要么都不做。
一致性(Consistency):事务执行结果必须从一个一致性状态到达另外一个一致性状态。如典型的银行转账,从账户A到账户B,如果账户A减少了但是账户B没有增加,则此时就是不一致的状态。
隔离性(Isolation):一个事务的操作对另一个事务来说是不可见的。
持久性(Durability):事务一旦提交,它对数据库的操作便是永久的。
四个特性的关系:一致性是最基本的属性,其它属性都是为保证一致性而存在的。数据库一致性实现场景中可以分为数据库外部一致性和数据库内部一致性,外部事务一致性是通过编码来实现的(比如说spring的事务),内部事务则是由数据库来保证。原子性是通过日志来保证的,将所有对数据的更新都写入日志中,如果只执行了事务的一部分,以后的操作由于故障无法继续执行,则恢复后将回滚,则就实现了原子性。
具体来说:事务的隔离性是通过锁来实现,redo log实现事务的持久性与一致性,undo log实现事务的原子性。
2.日志
1.redo log
通常是物理日志,记录的是数据页的物理修改,而不是某一行或某几行修改成怎样怎样,它用来恢复提交后的物理数据页(恢复数据页,且只能恢复到最后一次提交的位置)。
redo log包括两部分:一是内存中的日志缓冲(redo log buffer),该部分日志是易失性的;二是磁盘上的重做日志文件(redo log file),该部分日志是持久的。innodb通过force log at commit机制实现事务的持久性,即在事务提交的时候,必须先将该事务的所有事务日志写入到磁盘上的redo log file和undo log file中进行持久化。
注:内存中(buffer pool)未刷到磁盘的数据称为脏数据(dirty data)。由于数据和日志都以页的形式存在,所以脏页表示脏数据和脏日志。
2.undo log
用来回滚行记录到某个版本。undo log一般是逻辑日志,根据每行记录进行记录。undo log有两个作用:提供回滚和多个行版本控制(MVCC),undo log也会产生redo log,因为undo log也要实现持久性保护
3.二进制日志
作为 MySQL服务器层日志,MySQL二进制日志按照事务提交的顺序,记录了所有事件,用户可以通过它完成 point_in_time 的恢复工作,并且MySQL的复制也需要它。默认情况下,二进制日志是关闭的,开启操作:log-bin=dir/filename
4.redo log与二进制日志的区别
二进制日志中也记录了innodb表的很多操作,也能实现重做的功能,但是它们之间有很大区别:
1)二进制日志是服务器层日志,任何存储引擎修改数据库都会产生二进制日志。而redo log是innodb层产生的,只记录innodb存储引擎中表的修改。并且二进制日志先于redo log被记录
2)二进制日志记录操作的方法是逻辑性的语句。而redo log是在物理格式上的日志,它记录的是数据库中每个页的修改。
3)因为二进制日志只在提交的时候一次性写入,所以二进制日志中的记录方式和提交顺序有关,且一次提交对应一次记录。而redo log中是记录的物理页的修改,redo log文件中同一个事务可能多次记录,最后一个提交的事务记录会覆盖所有未提交的事务记录。
3.数据库的恢复原理
InnoDB存储引擎带有缓冲池,其中存储的是数据库页面的缓存,对InnoDB的任何修改操作都会首先在缓冲池的page上进行,并将修改后的页面标记为脏页,后由master thread或刷脏线程阶段性的将这些页面写入磁盘。这样可以减少磁盘IO进而提高效率。然而,如果进行刷脏时,server非正常关闭,这些修改操作将会丢失,如果写入操作正在进行,甚至会由于损坏数据文件导致数据库不可用。为了避免上述问题的发生,Innodb将所有对页面的修改操作写入redo日志,并在数据库启动时从此文件进行恢复操作。这样的技术推迟了bp页面的刷新,从而提升了数据库的吞吐,有效的降低了访问时延。带来的问题是额外的写redo log操作的开销(顺序IO,当然很快),以及数据库启动时恢复操作所需的时间。
本站所有文章均由网友分享,仅用于参考学习用,请勿直接转载,如有侵权,请联系网站客服删除相关文章。若由于商用引起版权纠纷,一切责任均由使用者承担
极客文库 » 数据库基础复习之mysql事务、存储引擎

Leave a Reply

欢迎加入「极客文库」,成为原创作者从这里开始!

立即加入 了解更多