函数begin_transaction接受一个布尔参数,指示应该进行什么类型的同步;真时是物理的,假时是逻辑的。
当它提到“物理”或硬同步时,它是什么意思?
函数begin_transaction接受一个布尔参数,指示应该进行什么类型的同步;真时是物理的,假时是逻辑的。
当它提到“物理”或硬同步时,它是什么意思?
我不太确定 Java 等价物,但是:
逻辑同步意味着任何数据库更改都会从 DBMS 缓存写入文件系统。在 C 中,您可以使用 fprintf/fwrite/write/etc 来执行此操作。
物理同步意味着上述内容,增加了要求操作系统将所述更改推送到永久存储(硬盘驱动器、SSD 等)而不是将它们保存在文件系统缓存中的操作。这样可以确保如果发生任何意外,这些更改不会丢失。在意味着调用 fsync() 或 fdatasync() 系统调用的 Linux/POSIX 系统上。
编辑:
显然,Java 中 fsync() 的等价物是 FileDescriptor.sync():
http://download.oracle.com/javase/1.4.2/docs/api/java/io/FileDescriptor.html#
关键是要为数据库实现真正的 ACID 语义,所有事务都应同步到永久存储介质。否则,您的应用程序必须能够处理静默失败的事务——DBMS 会将事务推送到文件系统并成功返回,但如果系统断电,这些更改可能会丢失。
物理同步的问题在于它会对性能产生重大影响。硬盘驱动器每秒可以处理有限数量的事务(SSD 在这方面要快得多),这就是为什么要提高数据库性能的第一件事是将插入捆绑到更大的事务中。