関数begin_transactionは、実行する同期のタイプを示すブール引数を取ります。trueの場合は物理、falseの場合は論理。
「物理的な」またはハードな同期を指す場合、それはどういう意味ですか?
関数begin_transactionは、実行する同期のタイプを示すブール引数を取ります。trueの場合は物理、falseの場合は論理。
「物理的な」またはハードな同期を指す場合、それはどういう意味ですか?
Javaに相当するものについては正確にはわかりませんが、次のようになります。
論理同期とは、DBの変更がDBMSキャッシュからファイルシステムに書き込まれることを意味します。Cでは、fprintf / fwrite / write/etcを使用してこれを行います。
物理的な同期とは、上記の変更をファイルシステムキャッシュに保持するのではなく、OSに永続ストレージ(ハードドライブ、SSDなど)にプッシュするように要求する追加の操作を意味します。これにより、不利なことが起こった場合でも、これらの変更が失われることはありません。Linux / POSIXシステムでは、fsync()またはfdatasync()システムコールの呼び出しを意味します。
編集:
どうやらJavaのfsync()に相当するのはFileDescriptor.sync()です:
http://download.oracle.com/javase/1.4.2/docs/api/java/io/FileDescriptor.html#
重要なのは、DBの真のACIDセマンティクスを実現するには、すべてのトランザクションを永続的なストレージメディアに同期する必要があるということです。そうしないと、アプリケーションはサイレントに失敗したトランザクションを処理できる必要があります。DBMSはトランザクションをファイルシステムにプッシュして正常に戻りますが、システムの電源が切れた場合など、変更が失われる可能性があります。
物理的な同期の問題は、パフォーマンスに大きな影響を与える可能性があることです。ハードドライブは1秒あたりの限られた数のトランザクションを処理できます(SSDはこれではるかに高速です)。そのため、DBのパフォーマンスを向上させるために最初に行うことは、より大きなトランザクションに挿入をバンドルすることです。