如何在linux上实现写交易?全部写入或什么也不做

How to implement writing transaction on linux? Write all or do nothing

我需要将 bytes1 写入 file1 并将 bytes2 写入 file2 并确保我不会在写入过程中捕获 no space left 异常。

或者也许有人知道 sql 数据库如何实现其文件的完整性?

我找到了一种实现交易的方法,但不知道这种方法的缺陷。关键元素是 truncate 系统调用,它将允许我们实现回滚逻辑。这是一个伪代码:

file1Pos = file1.tell()
file2Pos = file2.tell()

err = file1.write(bytes1)
if err != nil {
    // rollback to previous position
    file1.truncate(file1Pos)
    // The file offset is not changed after truncation
    file1.seek(file1Pos, SEEK_SET)
}

err = file2.write(bytes2)
if err != nil {
    file1.truncate(file1Pos)
    file1.seek(file1Pos, SEEK_SET)

    file2.truncate(file2Pos)
    file2.seek(file2Pos, SEEK_SET)
}

根据 Is file append atomic in UNIX? 如果使用 O_DIRECT 打开文件,则在 linux 上的单次写入是原子的。如果您搜索“atomic write”,可能会有更多的发展。