Mysql-一条更新语句要经历那些流程
- Mysql客户端将SQl语句传入MysqlServer层
- 将name=666的数据查找到,实际上,存储引擎去磁盘当中找到这条数据,并加载Buffer Pool当中然后将name=666所在行的数据name字段改为涛哥
- 修改以后不会将修改结果直接修改进磁盘,而是将修改进内存当中,会等待刷脏
- 记录Redo Log,记录Redo Log之后,并将这行记录状态改为prepare(准备状态),并没有commit
- 修改了好了之后,可以提交事务
- 生成操作Bin Log,并将Bin Log写入磁盘后
- 存储引擎提交事务
- 将Redo Log改为commit,事务完成
为什么Redo Log需要2阶段提交
Redo Log写入,Bin Log未写入:此时Mysql异常重启能根据Redo Log恢复name='涛哥’的数据。但Bin Log没有记录。后续使用Bin Log回复临时库,会出现数据丢失,导致状态不一致。
Bin Log写入,Redo Log未写入:此时Mysql异常重启能根据Bin Log重放name='涛哥’的数据。但Redo Log没有记录。重启后没有name='涛哥’的数据,会出现数据丢失,导致状态不一致。
#Java##MySQL#