概述
未开启binlog
- 清理undo段信息,对于innodb存储引擎的更新操作来说,undo段需要purge,这里的purge主要职能是,真正删除物理记录。在执行delete或update操作时,实际旧记录没有真正删除,只是在记录上打了一个标记,而是在事务提交后,purge线程真正删除,释放物理页空间。因此,提交过程中会将undo信息加入purge列表,供purge线程处理。
- 释放锁资源,mysql通过锁互斥机制保证不同事务不同时操作一条记录,事务执行后才会真正释放所有锁资源,并唤醒等待其锁资源的其他事务;
- 刷redo日志,前面我们说到,mysql实现事务一致性和持久性的机制。通过redo日志落盘操作,保证了即使修改的数据页没有即使更新到磁盘,只要日志是完成了,就能保证数据库的完整性和一致性;
- 清理保存点列表,每个语句实际都会有一个savepoint(保存点),保存点作用是为了可以回滚到事务的任何一个语句执行前的状态,由于事务都已经提交了,所以保存点列表可以被清理了。
开启binlog
参考链接
binlog为了解决Mysql主从备份而产生
1. 内部XA:redo log和bin log的数据一直性和完整性的保证
2. 外部XA:分布式事务
内部XA(二段式提交),由于需要遵循WAL原则,binlog的过程需要嵌入到事务提交的流程中:
1. prepare过程
2. commit过程
prepare过程
1.设置undo state=TRX_UNDO_PREPARED; //trx_undo_set_state_at_prepare调用
2.刷事务更新产生的redo日志;【步骤1产生的redo日志也会刷入】
trx_prepare_for_mysql
{
1. trx_undo_set_state_at_prepare
//设置undo段的标记为TRX_UNDO_PREPARED
2. 设置事务状态为TRX_STATE_PREPARED
3. trx_flush_log_if_needed
//将产生的redolog刷入磁盘
}
commit过程
1.将事务产生的binlog写入文件,刷入磁盘;
2.设置undo页的状态,置为TRX_UNDO_TO_FREE或TRX_UNDO_TO_PURGE; // trx_undo_set_state_at_finish调用
3.记录事务对应的binlog偏移,写入系统表空间; //trx_sys_update_mysql_binlog_offset调用
MYSQL_BIN_LOG::commit
ordered_commit
{
1.FLUSH_STAGE
flush_cache_to_file
//
刷binlog
2.SYNC_STAGE
sync_binlog_file
//Call fsync() to sync the file to disk.
3.COMMIT_STAGE
ha_commit_low
{
binlog_commit
innobase_commit
trx_commit(trx)
{
trx_write_serialisation_history(trx, mtr);
//更新binlog位点,设置undo状态
trx_commit_in_memory(trx, lsn); //释放锁资源,清理保存点列表,清理回滚段
}
}
}
二段式提交过程出现异常:
1. binlog已落盘,则事务应该提交;
2. binlog未落盘,则事务就应该回滚
最后
以上就是耍酷星月为你收集整理的Mysql 事务提交过程的全部内容,希望文章能够帮你解决Mysql 事务提交过程所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复