如何在Linux上实现写事务?全部写入或不执行任何操作

时间:2018-06-26 12:10:41

标签: linux transactions diskspace

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

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

2 个答案:

答案 0 :(得分:0)

我找到了一种实现事务的方法,但不知道该方法的陷阱。关键元素是truncate syscall,它将使我们能够实现回滚逻辑。这是一个伪代码:

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)
}

答案 1 :(得分:0)

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