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