python - Python 中任何与 ACID 在数据库中具有相同安全性的写入函数

标签 python acid

标题本来可以写得更好,但无论如何。我想知道是否有任何写入文件的函数,就像数据库的 ACID 属性一样。原因是,我想确保我正在执行的文件写入不会在断电时弄乱和损坏文件。

最佳答案

根据您对文件的具体处理方式和平台,有几种选择:

  • 如果您重复将 blob 从内存序列化到磁盘以保持状态(例如:dhcp 租用文件), 如果您使用的是 Posix 系统,则可以将数据写入临时文件并将临时文件“重命名”为您的目标。在 Posix 兼容的系统上,这保证是一个原子操作,甚至文件系统是否被记录都无关紧要。如果您使用的是 Windows 系统,则有一个名为 MoveFileTransacted 的 native 函数您可以通过绑定(bind)使用。但这里的关键概念是,临时文件保护你的数据,如果系统重新启动,最坏的情况是你的文件包含最后一次良好刷新的数据。此选项要求您每次要记录更改时都写出整个文件。对于 dhcp.leases 文件,这对性能影响不大,更大的文件可能会更麻烦。

  • 如果您不断地读写数据位,sqlite3 是您的不二之选——它支持查询组的原子提交,并拥有自己的内部日志。这里需要注意的一件事是,由于锁定数据库、等待数据刷新等的开销,原子提交会变慢。

还有一些其他的事情要考虑——如果你的文件系统是异步挂载的,写操作看起来已经完成,因为 write() 返回了,但它可能还没有被刷新到磁盘。在这种情况下,重命名可以保护您,sqlite3 也可以。

如果您的文件系统是异步挂载的,则可以写入数据并在写入数据之前移动它。所以如果你在 unix 系统上,挂载同步可能是最安全的。不过,这已经达到了“如果失败,人们可能会死”的偏执狂水平。但是,如果它是一个嵌入式系统并且它死了,“如果失败我可能会丢掉工作”也是额外保护的一个很好的合理化。

关于python - Python 中任何与 ACID 在数据库中具有相同安全性的写入函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4352106/

相关文章:

java - ANTLR 错误 134

sql-server - 如何立即提交存储过程?

mysql - 在 MyISAM 表中执行 START TRANSACTION 时会抛出任何错误吗?

python - 使用 Python 随机配对列表中的项目

python - 在Jupyter notebook中,如何安排子程序才能高效地编写项目?

python - 使用代理处理 HTTPS 连接请求

transactions - Cassandra 报告失败但只写了部分怎么办?

python - 在函数中使用 if "x"进行计算,但未生成总计

rdbms - 典型的 ACID RDBMS 每次提交都会同步到磁盘吗?

haskell - 我想使用酸存储 aeson 的值类型