mysql事务简述

来源:互联网 发布:java 方法区 内存溢出 编辑:程序博客网 时间:2024/06/07 02:13
底层基于redo, undo日志来做。

undo用于回滚,redo用于down机后恢复数据

redo物理文件名:ib_logfile0和ib_logfile1

eg:
将库存skuStore从1改成2,假设事务号为:x需要做的事情如下:
1.begin transaction,有唯一事务id
2.记录undo log,skuStore=1
3.做事务操作,即设置skustore=2,这里对应事务x的内存数据会被更改,这时涉及内存操作,真正数据刷盘需要等到commit后并且受刷盘策略影响
4.记录redo log,即skustore=2 //必须刷盘,这步做完后即使这步后db挂了,重启时也能恢复
5.commit or rollback,这里也涉及写入到事务日志,即在日志文件中写入commit或rollback,表明一个事务的结束。
个人理解一个事务日志文件,即undo可以记录在redo日志中,这样可以顺序写。

问题:
1.如果第2步挂了怎么办?【记录undo log】
没做任何东西,所以没关系
2.第3步挂了?【做事务操作】
走回滚操作,用undo回滚
3.第4步挂了?【记录redo log】
走回滚操作。
4.第5步挂了?【commit or rollback】
如果事务日志中没有结束符【commit或rollback】,走回滚操作。
这里如果走提交操作会有问题,应用程序如果访问db,db这时挂了,应用程序这时会接收到异常,通常是认为事务操作未完成。
而db这块,如果之后重启后走正向的commit操作,就会使数据不一致。

原创粉丝点击