我的想法是这样的:对于数据库来讲,写操作最终应该是通过write()这样的系统调用进行的,在数据库的一次完整性的写,应该是有多个write()操作,而对操作系统来讲,它每收到一次write系统调用的请求,它就会向存储发送一次写命令,而存储也就会执行一次写操作(这里假设没有使用raw device,...
显示全部我的想法是这样的:
对于数据库来讲,写操作最终应该是通过write()这样的系统调用进行的,在数据库的一次
完整性的写,应该是有多个write()操作,而对操作系统来讲,它每收到一次write系统调用的请求,
它就会向存储发送一次写命令,而存储也就会执行一次写操作(这里假设没有使用raw device,如果用file,可能
先写在file cache里,然后再定期sync到disk上),
所以说数据库的写完整性是只能由数据库来保证,存储是不会保证的,
假设一次数据库写操作需要调用10次write() 系统调用,当调用到第五次时,
server crash了,我认为前五次的写操作应该已经apply到disk上了,存储
应该不会知道这只是数据库一次写请求的一部分。
但是存储能保证这5次写请求能够按照原顺序写入,这个应该没有问题。
当然,很有可能数据库不是简单通过write()来实现的,我记得在unix里有聚集写(writev)这样的系统调用,
可以一次写多个非连续缓存。
数据库是个非常复杂的系统,可能还有其他一些技术能保证写完整性,仅凭我的这点水平,
其实还远不足以解释这么深入的问题,这块还需要wang给我们多多指点,
让我们能够更深入的了解数据库的底层机制。
收起