我需要将bytes1
写入file1
,将bytes2
写入file2
,并确保在写作过程中不会遇到no space left
异常。
或者也许有人知道sql数据库如何实现其文件的完整性?
答案 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 上单次写入是原子的。如果您搜索“原子写入”,可能会有更多进展。