三阶段比二阶段多了一个询问阶段和一个超时机制
一、询问阶段
1、老大向所有的小弟询问能否提交事务
2、小弟收到询问后响应老大能或否,并进入预备状态
二、准备阶段
三种情况:
所有小弟都返回能
1、老大开始本地事务,向所有的小弟节点发起事务开始请求
2、小弟们收到老大的事务请求以后开始执行本地事务,并记录本地日志,方便后续有异常回滚,然后返回老大成功还是失败,但是不提交本地事务、不释放锁资源
有小弟返回否
1、老大向所有的小弟发送中止事务请求
2、小弟收到请求后或者等待一段时间一直未收到老大的任何指令后中止本地事务
老大由于某种原因一直没有收到小弟的响应(即超时)
1、老大向所有的小弟发送中止事务请求
2、小弟收到请求后中止本地事务
三、提交阶段
两种情况
所有小弟返回成功
1、老大向所有小弟发起提交事务请求
2、小弟们收到老大的提交事务请求以后,提交本地事务,并释放锁资源,向老大返回提交事务成功
3、老大接收到小弟的响应以后结束本地事务
有小弟返回失败或者超时一直未接收到小弟的响应
1、老大向所有小弟发起回滚事务请求
2、小弟们收到老大的回滚事务请求以后,回滚本地事务,并释放锁资源,向老大返回终止事务成功
3、老大取消本地事务
注意:由于超时机制,如果有小弟一直没有收到老大的提交事务请求,那么会自动提交本地事务。为什么会这么做呢?
因为,在事务的最开始老大就已经问过所有的小弟能否做事务了,并且所有的小弟都说的能,所有小弟才会收到老大的提交事务请求;那么,小弟就在很大程度上认为别的小弟也都能提交事务成功(其实就是概率问题)。
so,三阶段提交也会有数据不一致问题。