C/S模式
当我们采用两阶段提交的方案时,而不是单台服务器转发,那么当多个客户端同时企图获取大部分服务器的锁的时候,会发生什么情况呢?客户端是否必须释放它们所有获得的锁,以避免死锁。又或者客户端获取部分锁之后挂掉了呢?
如果我们让这种锁可以过期如何?我们称这种可以过期的锁为票。这样就不会一直锁住没有被释放锁的服务器。首先是客户端向所有服务器请求一张票,票是服务器发给客户端的,当客户端收到半数服务器发送过来的票的时候,就会将这张票和命令一起发送给所有服务器。如果服务器发现收回来的票是自己最新发送出去的时候,并且没有过期,就会给客户端一个正反馈。客户端收到了过半服务器的正反馈,就会通知所有的服务器开始执行命令。但服务器一直没有收到客户端执行命令的通知,它同时还会继续接受其他客户端发送过来的票请求,并将发送一张最新的票给其他客户端。当有其他客户端得到半数票以后,会将新票和自己的命令发送给所有服务器。这个时候如果部分服务器收到了这个命令和票的时候,而之前的收到了过半服务器正反馈的客户端通知所有服务器开始执行命令,这个时候就会出现所有服务器的命令不一致。