您的位置:首页 > 数据库 > MySQL

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未落盘,则事务就应该回滚
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: