【发布时间】:2012-03-14 01:51:47
【问题描述】:
我的数据库引擎通过发出整个磁盘块的 write() 系统调用来写入 64 字节的记录。设备以 O_DIRECT 模式打开。例如,块中的第三条记录从第 128 个字节开始,到第 192 个位置结束,当我执行 UPDATE 时,整个磁盘块(默认为 512 个字节)被写入。
我的问题是,如果每次 UPDATE 发生时我都在自身上写入记录,我可以校准 ACID 合规性吗?通常数据库引擎分两步执行此操作,将修改后的磁盘块写入另一个(空闲)位置,然后在第一次写入返回成功后立即使用一次(原子)写入将索引更新到新块。但我没有这样做,我正在用新的数据覆盖当前数据,期望写入成功。我的方法有任何潜在的问题吗?是否符合 ACID 标准?如果硬件只写入块的一半,而我的记录正好在中间怎么办?还是硬件已经完成了我描述的两步编写过程,但是在块级别,所以我不需要在软件中重复相同的过程?
(注意:没有记录大于物理磁盘块(默认为 512 字节)并且 fsync 在每次 write() 之后进行,这仅适用于 Linux)
【问题讨论】:
标签: linux database-design