MQ事务消息两阶段提交过程
![](https://img.haomeiwen.com/i11982172/12e775f3de396784.png)
主要的过程为:
1、先向服务端发送半事务消息,发送成功后执行本地事务
2、本地事务执行成功则Commit,执行失败则Rollback
3、如果执行本地事务或反馈给服务端过程中crash,这个时候服务端的消息状态处于unknown
4、服务端通过TransactionCheckListener,回查本地事务的状态
5、如果本地事务执行成功则Commit,失败就Rollback。
参考资料:https://help.aliyun.com/document_detail/29548.html
Mysql两阶段提交过程
以“update set c = c + 1 where id = 2”这条更新语句为例,看一下执行流程
![](https://img.haomeiwen.com/i11982172/3db1544039514e79.png)
mysql使用了二阶段提交来保证宕机数据可恢复且主备数据一致。
1)先写redolog ,设置为prepare状态
2)写入binlog
3)提交事务,并将redolog设置为commit状态
假如在时刻A发生了crash,由于binlog还没写,redolog也没提交,所以恢复的时候这个数据会回滚。由于binlog没写,也不会传到备库。
Mysql崩溃恢复时的判断规则:
1、redolog里面的事务是完整的,也就是有了commit标识,则直接提交;
2、redolog里面的事务只有完整的prepare,则判断binlog是否存在且完整
a) 如果完整,则提交事务;b) 如果不完整,则回滚事务。
所以假如时刻B发生了crash,对应的是2(a)这种情况。崩溃恢复过程中事务会被提交。
参考资料:https://time.geekbang.org/column/article/73161
网友评论