MySQL事务机制是如何实现的

  

下文主要给大家带来MySQL事务机制是如何实现的,希望MySQL事务机制是如何实现的能够带给大家实际用处,这也是我编辑这篇文章的主要目的。好了,废话不多说,大家直接看下文吧。

,,,,,,MySQL提供了两种事务型的存储引擎:InnoDB和NDB集群。另外还有一些第三方存储引擎也支持事务,比较知名的包括XtraDB和PBXT。下面以InnoDB来说明。

,,,,,,MySQL会最大程度的使用缓存机制来提高数据库的访问效率,但是万一数据库发生断电,因为缓存的数据没有写入磁盘,导致缓存在内存中的数据丢失而导致数据不一致怎么办?

,,,,,InnoDB才能主要是通过事务日志实现酸特性,事务日志可以帮助提高事务的效率。使用事务日志,存储引擎在修改表的数据时只需要修改其内存拷贝,再把该修改行为记录到持久在硬盘上的事务日志中,而不用每次都将修改的数据本身持久到磁盘。下载

,,,,,,事务日志采用追加的方式,因此写日志的操作是磁盘上一小块区域的顺序I/O,而不像随机I/O需要在磁盘的多个地方移动磁头。所以事务日志的方式相对来说要快得多。事务日志持久以后,内存中被修改的数据在后台可以慢慢的刷回磁盘。目前大多数存储引擎是这样实现的,我们称之为预写式日志,即修改数据需要写两次磁盘。

,,,,,,事务日志包括重做日志重做和回滚日志撤销、重做记录的是已经全部完成的事务,就是执行了承诺的事务,记录文件是ib_logfile0 ib_logfile1.Undo记录的是已部分完成并且写入硬盘的未完成的事务,默认情况下回滚日志是记录在表空间中的(共享表空间或者独享表空间)。

,,,,,,一般情况下,mysql在崩溃之后,重启服务,innodb通过回滚日志撤销将所有已完成并写入磁盘的未完成事务进行回滚,然后重做中的事务全部重新执行一遍即可恢复数据,但是随着重做的量增加,每次从重做的第一条开始恢复就会浪费长的时间,所以引入了检查点机制。

,,,,,一般业务运行过程中,当业务需要对某张表的某行数据进行修改的时候,innodb会先将该数据从磁盘读取到缓存中去,然后在缓存中对这条数据进行修改,这样缓存中的数据就和磁盘的数据不一致了,这个时候缓存中的数据就称为脏页面,只有当脏页统一刷新到磁盘中才会是干净的页面。下载

,,,,,检查点:如果在某个时间点,脏页的数据被刷新到了磁盘,系统就把这个刷新的时间点记录到重做日志的结尾位置,在进行恢复数据的时候,检查站时间点之前的数据就不需要进行恢复了,可以缩短时间。

,  MySQL事务机制是如何实现的

Innodb_log_buffer_size重做日志缓存大小

Innodb_log_file_size重做日志文件大小,文件越大数据恢复的时间越长

Innodb_log_file_group重做日志文件数量默认是2个ib_logfile0 ib_logfile1

,

,,,,,,事务日志的的机制实际上是满足的事务的原子性和持久性,即要么都成功,要么都失败。而谈到事务的一致性和隔离性,就要谈到“锁”了。

,,,,,,InnoDB采用的是两阶段锁定协议。在事务执行过程中,随时都可以执行锁定,锁只有在执行提交或回滚时才会释放,并且所有的锁同一时刻释放.InnoDB会根据隔离级别在需要的时候自动加锁。

,,,,,,MySQL的大多数事务型存储引擎实现的都不是简单的行级锁。基于提升并发性能的考虑,它们一般都同时实现了多版本并发控制(MVCC) .MVCC实现了非阻塞的读操作,写操作也只锁定必要的行.MVCC的实现,是通过保存数据在某个时间点的快照来实现的。对于InnoDB,是通过在每行记录后面保存两个隐藏的列来实现的。这两个列,一个保存了行的创建时间,一个保存了行的过期时间(或删除时间)。当然存储的并不是实际时间值,而是系统版本号。每开始一个新的事务,系统版本号都会自动递增。事务开始时刻的系统版本号会作为事务的版本号,用来和查询到的每行记录的版本号进行比较。下面看一下在MySQL默认隔离级别可重复读下,MVCC具体是如何操作的。下载

,选择

,InnoDB会根据以下两个条件检查每行记录:

,一。InnoDB只查找版本早于当前事务版本的数据行(也就是,行的系统版本号& lt;=事务的系统版本好),这样可,,以确保事务读取的行,要么是在事务开始前已经存在的,要么是事务自身插入或修改过的。

,b。行的删除版本要么未定义,要么大于当前事务版本号。这样可以确保事务读取到的行,在事务开始之前未被,删除.

MySQL事务机制是如何实现的