安全地写入文件算法的一部分(原子部分写入)

时间:2019-02-07 20:27:14

标签: mysql database postgresql disk acid

假设我要编写简单的数据库(在Linux上工作),但必须满足以下条件:

它只有两个功能:

  1. write_chunk(索引,字节)
  2. read_chunk(index)

其中索引是0到1M之间的整数,字节是100字节的块。 我希望在每次调用write_chunk之后自动传输文件状态。

所以我想确定:

  1. 100字节的块写入位置索引* 100的文件中
  2. 所有100个字节的原子写入(或根本不写入)
  3. 如果在写入时突然断电(先前有效的100个字节 恢复)

我想像这样的实现:

编写函数实现:

  1. 在开始写入100字节之前,我们从中复制previos 100字节 将index * 100定位到另一个文件以进行回滚(索引也已复制)。 我们也使用哈希对所有回滚文件数据进行签名。在回滚时执行fsync。
  2. 然后我们开始在位置index * 100处写入新的100个字节, fsync。
  3. 如果步骤2正常,我们将从回滚文件中删除所有数据。
  4. 我们将确定返回给函数调用者。

读取函数实现:

  1. 如果我们开始读取和回滚文件不为空且无效,则我们 从回滚还原100个字节并删除回滚或只是删除 如果哈希无效,则回滚。

  2. 我们从位置索引* 100中读取数据块并返回数据

使用以下算法是否安全?

因此,我想确保与mysql或postgresql之类的数据库处于同一安全级别。提交后执行插入语句。

我可以使用什么技术来保证原子性和持久性写入,我的意思是可能我需要在块上使用一些哈希以确保其有效或使用回滚文件的双重副本。或者一次将数据存储在回滚文件中一次,以确保磁盘子系统刷新。 (我听说即使写入后我调用fsync也不安全,它取决于磁盘子系统,然后它才实际写入数据。)

1 个答案:

答案 0 :(得分:0)

只要没有并发性,那应该就可以工作,也就是说,这些功能中只有一个可以同时运行。

为什么不使用简单的嵌入式数据库