TDBISAMDatabase
データベースを開く
TDBISAMDatabaseは、ある場所にあるテーブルをまとめて管理するためのエリアスを提供します。
主なメンバ
TDBISAMDatabase
property DatabaseNameTDBISAMTable/TDBISAMQueryが名前で参照するので、最低限セットする必要があります
property SessionNameデータベース接続に使うセッション名を指定します
property Directoryローカル接続の場合、テーブルデータのファイルが存在するディレクトリを指定します
property RemoteDatabaseリモート接続の場合、サーバが公開しているデータベースを参照します
property HandleShared同一のセッション下に複数のTDBISAMDatabaseがあって同一のデータベースを参照する場合は、このプロパティをTrueにセットして、DatabaseNameを同じにセットすることでデータベースハンドルを共有できます。通常は、同一セッション下の複数のDatabaseは同じDatabaseNameを持つことができません
property KeepConnectionローカル接続の場合には関係ないプロパティです。リモート接続の際にTrueにすることで、サーバとの接続を保ち、レスポンスを向上させる効果があります
property ConnectedTrueにすることで、データベースをオープンします
procedure OpenConnected := True と同じ効果です
procedure CloseConnected := False と同じです
property DataSetCountデータベースを参照しているTDBISAMQuery/TDBISAMTableの数を返します
property DataSets[Index: integer]TDatabase : データベースを参照しているTDBISAMQuery/TDBISAMTableを返します
procedure CloseDataSetsデータベースを参照しているすべてのデータセット(TDBISAMQuery/TDBISAMTable)をクローズしますが、データベース自体はConnectedの状態を保ちます
トランザクションのコントロール
TDBISAMDatabaseは、以下のメソッドを通じてトランザクションコントロール機能を提供します
TDBISAMDatabase
procedure StartTransactionトランザクションを開始します。
procedure Commit(ForceFlush:Boolean)トランザクションをコミットし、ForceFlush=TrueならOSのキャッシュもフラッシュしてディスクに確実に書き込みます
procedure Rollbackトランザクションをロールバックします
property InTransaction=booleanトランザクションが始まっているかどうかを返します。StartTransactionでTrueになり、Commit/RollbackでFalseになります。HandleShared=Trueでデータベースハンドルを共有している場合、同じデータベースハンドルを共有するすべてのTDBISAMDatabaseで、InTransactionは同期して変化します
トランザクションの効果(重要)
DBISAMのトランザクションは、以下の性質を持っています。特に1番目の性質は、DBISAMのトランザクション実装の特異な性質ですので、注意が必要です。
- DBISAMは、トランザクションが開始されると、同一セッション・同一データベースにあってオープンされているすべてのテーブルをロックします。このロックによって、他のユーザ/セッションによるデータの追加・更新・削除の全てが出来なくなります。(他のユーザがテーブルやレコードにロックをかける可能性は残ります)
- トランザクション中に獲得されたレコードロック・テーブルロックは、トランザクションがコミットされるまで保持されます。RDBMSとして当然のことです。この際に、OSのファイルロック機構が使われるため、古いNetwareなどユーザあたりのロックの数が制限されている環境で問題が発生する可能性があります
- DBISAMでは、トランザクション中の更新はローカルメモリにキャッシュされ、データファイルの更新はコミット時にまとめて行われます。そのため、大量データの挿入などを行う場合は、トランザクションを使って一括して挿入することで、データファイルへの書き込みをまとめて行うことができ、性能が向上します
- SQLのINSERT/UPDATE/DELETEは、トランザクションの外で実行された場合、暗黙のうちにトランザクションを作成します
上記の1.の性質については、議論があるところです。トランザクションの開始が実質的に大量のテーブルロックを招くので、トランザクションはできるだけ短時間で終わらせなければなりません。しかしながら、この仕様はある意味合理的な仕様であるともいえます。
- フル規格のクライアント/サーバ型データベースと異なり、ファイル共有型のデータベースにおけるトランザクションの実現は、もともと問題をはらんでいます。DBISAMの実装は、トランザクション中の障害に対して最もデータの安全性が保てるように、ファイル共有型データベースという成約の元で考えられた最善の方式であるといえます
- DBISAMはコミットするまでテーブルファイルをロックしますが、テーブルデータは更新しないので、トランザクション中にクライアントPCがハングアップした場合に、テーブルデータはトランザクション開始前の状態で保たれます
- トランザクション開始時にテーブルをロックすることで、トランザクション中に他のユーザと更新が競合する可能性が排除されています。このため、DBISAMのトランザクションは、他のユーザによる更新を随時チェックすることなく、高速に動作できます。
- しかし、クライアント・サーバ環境においてもファイルサーバ環境の影響を引きずっているため、トランザクション数が多くなるとパフォーマンスは悪化します。トランザクションあたりの処理時間を1秒未満に抑えても、同時に数十~数百のトランザクションが発生するような環境では、DBISAM C/S版をもってしてもパフォーマンスの劣化が起こるでしょう。このような状況では、Oracle/SQL Server/Interbase など、最初から二層クライアント/サーバ向けに設計されたRDBMSを採用してください