5 并发访问与存储关系
数据库系统需要支持并发访问。并发访问,要访问数据,而数据存在与buf中,所以,对于buf的读写,就需要有并发访问控制。PG通过锁和缓存页面标志(pin和reference)来控制并发访问。这样的方式,出于逻辑IO层。
尽管物理IO位于buf层下,但是,存储层的访问,也还是存在并发导致的冲突可能。PG处理存储层的并发冲突,是通过锁来控制磁盘文件操作、对临界区加锁保证对文件访问的互斥,从而保护文件不被并发访问所破坏。
这样的操作,其实是刷出数据的时机和何时需要读数据到缓存这两种操作发生时的情况下进行的。
6 与存储相关的事务处理
在存储层,与事务直接相关的操作,如下:
与单个事务相关 | 与事务和某特殊进程相关 | 与主进程相关 |
AtEOSubXact_Files CommitSubTransaction AbortSubTransaction | AtEOXact_Files BackgroundWriterMain WalWriterMain CommitTransaction PrepareTransaction AbortTransaction| | AtProcExit_Files InitFileAccess |
在事务提交或结束时,清理一些临时文件等相关内容 | 在事务提交或结束时,在缓存写出进程、日志刷出进程结束前,清理一些临时文件等相关内容 | 在InitFileAccess 函数中,注册一个钩子函数,当pg主进程退出时,需要做一些文件清理工作,调用如下: on_proc_exit(AtProcExit_Files, 0); |
其他与事务相关的操作,分散在了缓存层、数据访问层等。可以简单认为:数据库的数据处理逻辑,基本上落在了数据缓存层及之上各层功能中,与处于底层的数据据存储层,实则关系不是很大(只是简单认为,这样想,有助于理解分层后的数据存储层)。