Mysql 事务提交过程
2017-02-06 17:00
441 查看
未开启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事务提交过程(二)
- MySQL事务提交过程(二)
- MySQL事务提交过程(二)
- mysql 事务 catch到异常 不提交,与RollBack()区别与过程分析
- MySQL事务提交过程(二)
- mysql源码解读之事务提交过程(二)
- MySQL事务提交过程(一)
- MySQL事务提交过程(二)
- MySQL 事务提交过程
- MySQL事务提交过程(一)
- MySQL事务提交过程(一)
- MySQL 事务提交过程
- mysql 事务提交过程
- mysql源码解读之事务提交过程(一)
- MySQL存储过程之事务管理
- [轉]MySQL存储过程例子,包含事务,参数,嵌套调用,游标,循环等
- MySQL存储过程中使用事务
- Mysql视图, 存储过程, 触发器, 事务
- MySQL存储过程例子,包含事务,参数,嵌套调用,游标,循环等