FileMakerで普段スクリプトを書くときにあまり意識することはありませんが、複数のユーザが使用するシステムではトランザクションを考慮することが重要です。今回はGeist Interactiveのトランザクションについての記事を紹介します。
FileMaker Transactions
(元記事はこちら)
あまり話題にあがることはありませんが、 FileMakerはデータベーストランザクションをしっかりサポートしています。MySQLや他のほとんどのリレーショナルデータベース管理システム(RDBMS)と同じように、完全なコミットとロールバックをサポートするスクリプトを書くことができます。これはとても良いことです。このサポートがなければ、 FileMakerプラットフォームで堅牢なマルチユーザ対応のアプリケーションを構築することは非常に困難になります。
FileMakerのトランザクションは明示的ではありません。「トランザクションを開始」というスクリプトステップはなく、特定の条件下で暗黙的に動作します。これらの条件を設定する方法がわかっていれば、FileMakerスクリプトでデータベーストランザクションを使用して変更内容をデータベースに保存させることができます。その結果、はるかに堅牢でスケーラブルなソリューションにすることができます。
なぜFileMakerでトランザクションが必要なのか?
私はマルチユーザ対応のネットワーク接続されたアプリケーションを構築する際の厳しい現実について別の記事で詳細に説明しました。これを要約すると、もしトランザクションがなければFileMakerスクリプトが実行されるときに何が起こるかについて確信できないということです。ネットワーク接続されたマルチユーザ対応のアプリケーションは、その本質から生じる多くの問題に直面する可能性があります。これは、いつ切れるかわからないネットワーク上で、複数のユーザが同じレコードを取り合っている可能性があり、その場合はルールによって編集権限を得ることができない場合があります。さらに悪いことには、オペレーティングシステムがスクリプトを強制的に中止したり、コンピュータまたはアプリケーション自体がクラッシュする可能性があります。
トランザクションによってこれらのトラブルを防ぐことはできませんが、データベースの整合性が失われるときにその影響を受けないようにすることができます。それは、データベースに加えたいすべての編集内容をひとまとめにして、それを単一操作でコミットすることによって行われます。その操作は、完全に失敗するか、完全に成功するかのいずれかになることが保証されています。部分的な成功はありえません。
完全な成功または完全な失敗は、どちらも許容できる結果です。どちらもあなたのデータの状態について完全な一貫性を提供します。変更のうち、どれが成功しどれが失敗したのかを、推測したり判断したりする必要はありません。データベース内のデータは、ある状態から別のある状態に遷移します。データベーストランザクションによって、中間状態が発生することは不可能になります。
FileMakerトランザクションの歴史
FileMaker 7以降、FileMakerはトランザクションを適切にサポートしてきました。しかし歴史を振り返ってFileMaker 7のプレスリリースを見ても、「トランザクション」についての説明を見つけることはできません。機能としてはまったく語られませんでした。しかし、いくつかの新しい挙動から類推して、FileMakerがデータをディスクに保存する方法に影響するいくつかの大きな変更が内部で行われたことが暗に示されました。
私を驚かせた仕様の変化は「レコード復帰」にありました 。FileMaker 7以降、[レコード復帰]では、編集したすべての関連レコードへの変更を元に戻すようになりました。これは大きな変更です。7より前のバージョンでは、同時に開くことができるレコードの最大数は3でした。ポータルでレコードを編集した場合は、そのレコード、親レコード、およびポータルの最初のレコードを開いてロックしました。したがって、3つのレコードに加えられた変更しか元に戻すことができませんでした。しかしFileMaker 7では、無制限の開かれた関連レコードを持つことができ、[レコード復帰]でそれらすべてを元に戻すことができます。
FileMakerでこれを可能にした方法は、真のデータベーストランザクションの採用であると、私は類推しました。DevConで、私は当時FileMakerの主任エンジニアの一人だったSean Flisakowksiにこれが事実かどうか尋ねました。彼はそれが事実であることを認めました。FileMakerの新しいデータベースエンジンは、実際にデータベーストランザクションを使ってデータをディスクに保存していました。
FileMakerトランザクションの使用
重要なのは、リレーションを介してデータベースに変更を加えることです。関連レコードに加えられた変更は、親レコードがコミットされるまでキャッシュされます。いつでも、「レコード復帰」を使用して、親レコードとそれに関連するすべてのレコードに加えた変更をロールバックできます。そのレコードをコミットすると、すべての関連レコードに加えたすべての変更が一度にコミットされます。
[関連レコードの作成を許可する]チェックボックスをオンにすると、リレーションを介してレコードを作成できます。多くのFileMakerユーザは、そのようなリレーションでポータル設定を使用して新規レコードを作成できることを知っています。スクリプトを使用してポータル行の最後に移動し、リレーションの相手側のフィールドを設定できます。しかし別の方法もあります。ターゲットテーブルに関連レコードがまだない場合、ポータルを使用する必要はありません。そのリレーションを通じてフィールドを設定するだけでも、新規レコードを作成できます。この小さなトリックを使ってできる、いくつかの非常に興味深いことがあります。リレーションを介してレコードを編集するのは簡単です。必要なのは、編集したいレコードとのリレーションだけです。編集したいレコードと通常のリレーションシップがない場合は、作成するだけです。主キーがある場合は、テーブル内の任意のレコードとリレーションを作成できます。私はこのような特別な目的で設定されたリレーションを、”ad hoc”なリレーションと呼びます。私はこの”ad hoc”なトランザクションを活用したスクリプトを含むTransactionsモジュールを、Modular FileMakerに投稿しました。
ポータルからレコードを削除することもできます。その場合はポータル設定で「ポータルレコードの削除を許可する」がチェックされていることを確認する必要があります。削除する関連レコードを選択するには、「ポータル行へ移動」スクリプトステップを使用します。次に「ポータル行を削除」スクリプトステップを使用します。
トランザクションを使用しない操作
全置換やインポートなどの一括編集操作では、FileMakerのトランザクションは使用されません。これらの操作の途中で何か異常が起こった場合、一部の変更はコミットされ、残りはコミットされません。全置換の対象の中にロックされたレコードがあった場合、そのレコードを編集することはできず、エラーになります。しかし、どのレコードが編集できなかったのかはわかりません。
スクリプトが終了する前にレコードをコミットする操作をした場合は、トランザクションが中断されます。暗黙的にレコードをコミットするスクリプトステップを避けたい場合があるでしょう。そのようなスクリプトステップには、「レイアウト切り替え」、「検索モードに切り替え」、「ウィンドウを閉じる」、「レコードに移動」などがあります。
1つのレイアウトに留まるようにしましょう。必要なテーブルとレコードを編集するために、必要なリレーションを作成しましょう。そうすれば、レコードをコミットする準備が整うまで、レコードを開いたままにしておくことに問題はありません。
留意点
FileMakerのトランザクションは非常に堅牢です。しかし、注意すべき点がいくつかあります。サーバがクラッシュしたタイミングによっては、トランザクションが破損する可能性があります。しかし、サーバ自体がクラッシュしない限りは、すべてが正しく処理されたと自信を持って言うことができます。
FileMakerスクリプトの書き方について、考え方を変える必要があるかもしれません。すべての操作を、1つのレイアウトと関連するテーブルオカレンスのコンテキスト内で完結させるのに慣れるには、ある程度時間がかかります。時には創造的思考が必要です。しかし、1つのトランザクションにまとめることができないというシナリオには、私はまだ一度も出会っていません。
柔軟、スケーラブル、障害耐性あり
単一のFileMakerトランザクションで、必要な数のレコードを作成、編集、削除することができます。上限は、トランザクションに対応したスクリプトを実行しているマシンのメモリ容量によります。数百万のレコードを作成し、さらに数百万のレコードを編集してから、1回の操作ですべてをコミットできます。あるいは全体を復帰するとデータベースは元に戻ります。
トランザクションを使用すれば、非正規化や転記などの手法を使用してデータベースを高速化できます。また原因不明の問題の数を減らすことができるでしょう。また、複雑な・マルチユーザの・ネットワーク接続されたアプリケーションが、レコードロック・クラッシュ・そして不安定なネットワークに耐えることを可能にします。もしかしたらあなたにより良い睡眠さえもたらすかもしれません。🙂
FileMakerのトランザクションは、FileMaker Pro、FileMaker Go、WebDirect、サーバサイドスクリプト、およびPerform Script On Serverを含む、すべてのFileMakerクライアントで動作します。