mysql事务简述

底层基于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操作,就会使数据不一致。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值