如何在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”,可能会有更多的发展。
我需要将 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”,可能会有更多的发展。