关于内存融合cache fusion中锁模式的一些思考

  1. 集群中不可能即存在写锁,又存在读锁。这个从读写锁的语义上已经定义。
  2. 集群中只能存在一个人持有写锁,其他人再申请写锁时必须要释放当前写锁。
  3. 集群中可能存在多个读锁。
  4. 集群中存在脏块时,可能存在(一个或多个)读锁(此时脏块持有者不一定拥有读锁,可能是其他人持有读锁),或者一个写锁(此时脏块持有者必然持有写锁)。
  5. 集群中无人持有写锁(无脏块)。此时申请写锁,直接多盘,并获取写锁。
  6. 集群中无人持有写锁(有脏块)。此时申请写锁,由当前脏块持有者转发数据块给申请者,并获取写锁。
  7. 集群中无人持有读锁(无脏块)。此时申请读锁,直接读盘,并获取读锁。
  8. 集群中无人持有读锁(有脏块)。此时申请读锁,由当前脏块持有者转发数据给申请者,并获取读锁。
  9. 集群中只能有一个人持有写锁。如果其他人申请写锁,必须等到当前写锁持有者释放锁之后,才能获取锁。在内存融合过程中,申请者发出写锁申请后,只可能收到一个人(那个人就是当前写锁持有者)发送过来的PCM_REPLY_BUFFER消息或者是收不到任何消息(此时阻塞等待释放写锁应答)。
  10. 集群中可能有多个人持有读锁(无脏块)。此时,如果有人继续申请读锁,可以直接获取读锁,然后直接读盘。
  11. 集群中可能有多个人持有读锁(有脏块)。此时,如果有人继续申请读锁,可以直接获取读锁,并由脏块持有者转发数据块给申请者。
  12. 集群中可能有多个人持有读锁(无脏块)。此时,如果有人继续申请写锁,那么需要通知其他读锁持有者释放读锁,等到申请者收集到所有读锁持有者的释放应答后,并由指定读锁持有者转发数据块给申请者,再加写锁。
  13. 集群中可能有多个人持有读锁(有脏块)。此时,如果有人继续申请写锁,那么需要通知其他读锁持有者释放读锁,等到申请者收集到所有读锁持有者的释放应答后,并由当前脏块持有者转发数据块给申请者,再加写锁。

你可能感兴趣的:(pgsql,数据库)