MySQL事务提交的流程
发布时间:2022-01-19 13:24:49 所属栏目:MySql教程 来源:互联网
导读:本篇内容介绍了MySQL事务提交的流程的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! 存储引擎实现事务的通用方式是基于 redo log 和 undo log。 简单
本篇内容介绍了“MySQL事务提交的流程”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! 存储引擎实现事务的通用方式是基于 redo log 和 undo log。 简单来说,redo log 记录事务修改后的数据, undo log 记录事务前的原始数据。 所以当一个事务执行时实际发生过程简化描述如下: 先记录 undo/redo log,确保日志刷到磁盘上持久存储。 更新数据记录,缓存操作并异步刷盘。 提交事务,在 redo log 中写入 commit 记录。 在 MySQL 执行事务过程中如果因故障中断,可以通过 redo log 来重做事务或通过 undo log 来回滚,确保了数据的一致性。 这些都是由事务性存储引擎来完成的,但 binlog 不在事务存储引擎范围内,而是由 MySQL Server 来记录的。 那么就必须保证 binlog 数据和 redo log 之间的一致性,所以开启了 binlog 后实际的事务执行就多了一步,如下: 先记录 undo/redo log,确保日志刷到磁盘上持久存储。 更新数据记录,缓存操作并异步刷盘。 将事务日志持久化到 binlog。 提交事务,在 redo log 中写入commit记录。 这样的话,只要 binlog 没写成功,整个事务是需要回滚的,而 binlog 写成功后即使 MySQL Crash 了都可以恢复事务并完成提交。 MySQL是通过WAL方式,来保证数据库事务的一致性和持久性,即ACID特性中的C(consistent)和D(durability)。 WAL(Write-Ahead Logging)是一种实现事务日志的标准方法,具体而言就是: 1、修改记录前,一定要先写日志; 2、事务提交过程中,一定要保证日志先落盘,才能算事务提交完成。 通过WAL方式,在保证事务特性的情况下,可以提高数据库的性能。 从上述流程可以看出,提交过程中,主要做了4件事情, 1、清理undo段信息,对于innodb存储引擎的更新操作来说,undo段需要purge,这里的purge主要职能是,真正删除物理记录。在执行delete或update操作时,实际旧记录没有真正删除,只是在记录上打了一个标记,而是在事务提交后,purge线程真正删除,释放物理页空间。因此,提交过程中会将undo信息加入purge列表,供purge线程处理。 2、释放锁资源,mysql通过锁互斥机制保证不同事务不同时操作一条记录,事务执行后才会真正释放所有锁资源,并唤醒等待其锁资源的其他事务; 3、刷redo日志,前面我们说到,mysql实现事务一致性和持久性的机制。通过redo日志落盘操作,保证了即使修改的数据页没有即使更新到磁盘,只要日志是完成了,就能保证数据库的完整性和一致性; 4、清理保存点列表,每个语句实际都会有一个savepoint(保存点),保存点作用是为了可以回滚到事务的任何一个语句执行前的状态,由于事务都已经提交了,所以保存点列表可以被清理了。 “MySQL事务提交的流程”的内容就介绍到这里了,感谢大家的阅读。如 (编辑:92站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |