以下为个人总结,如有问题,欢迎提出
sql:update test set name = 'test' where id=2;
事务完整流程:
1.事务开始
2.申请锁资源,对id=2这行数据上排他锁
3.将需要修改的data pages读取到innodb_buffer_cache
4.记录id=2的数据到undo log
5.记录id=2修改后的数据到redo log buffer
6.将buffer cache中id=2得name改为test
7.commit,触发二阶段提交2pc
8.事务结束
知识点科普:
WAL:write ahead logging
针对数据文件的修改,必须遵循日志先行原则。也即是将数据持久化到磁盘之前必须确保redo log落盘。
二阶段提交(2pc two phase commit):
二阶段提交,首先redo log prepare,然后写入binlog,最后redo log commit。主要是保证redo log事务写入顺序和binlog 事务顺序一致(通过事务id保证一致)。
完整流程如下:
prepare阶段:redo持久化到磁盘(redo group commit),并将回滚段置为prepared状态,此时binlog不做操作
commit阶段:innodb释放锁,释放回滚段,设置undo log提交状态,binlog持久化到磁盘,然后存储引擎层提交
文章转载自数据库笔记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。