トランザクションの処理
Webリクエストを処理している間、OutSystemsはデータベースへの最初のアクセスでデータベーストランザクションを開始します。OutSystemsがユーザーにレスポンスを送信する前に、トランザクションはコミットされます。
例外が捕捉されずに残った場合、トランザクションはロールバックされます。これはトランザクション内でデータベースに対して行われた変更がすべて元に戻され、このようにしてデータの一貫性が保たれるということを意味します。
明示的なトランザクションの終了
CommitTransactionとAbortTransactionアクションを使用して、トランザクションを明示的に管理できます。
-
CommitTransaction: データベースにCOMMIT文を発行し、現在のトランザクションの開始時点からデータベース上で実行されたすべての変更を有効にします。さらに、現在のトランザクションを終了し、新しいトランザクションを開始します。CommitTransactionの後、アクションフローは続行します。
-
AbortTransaction: ROLLBACK文を発行し、現在のトランザクションの開始時点からデータベース上で実行されたすべての変更を元に戻します。さらに、現在のトランザクションを終了し、新しいトランザクションを開始します。AbortTransactionの後、アクションフローは続行します。
分離レベル
以下のテーブルは、OutSystemsが異なるデータベースで使用する分離レベルを示しています。
DB2 | MySQL | Oracle | SQL Server |
---|---|---|---|
Read Committed | Read Uncommitted | Read Committed | Read Uncommitted |
MySQLまたはSQL Serverデータベースを使用する際は、Read Uncommitted分離レベルで作業を行います。Webリクエストごとに複数のトランザクション(書き込み用に1つ、各読み取り用に1つずつ)があります。
DB2またはOracleデータベースを使用する際は、Read Committed分離レベルで作業を行います。クエリ、挿入、更新などはすべて同じデータベーストランザクション内で発生します。トランザクションがコミットされた場合のみ、データはデータベースに保存されます。
つまり、トランザクション内でまだコミットされていないデータは読み取ることができません。このため、プロセスインスタンスまたは利用しているWebサービスのメソッドを呼び出す前に、プロセスまたはメソッドで最新データを参照するためにデータベーストランザクションをコミットする必要があります。
重要な注意事項
トランザクションに関して、注意が必要な側面がいくつかあります。
- トランザクションは常に連続的であり、入れ子にすることはできません。
- トランザクションをコミットまたはロールバックした後、すべてのデータベースにかけられたロックは最終的に解除されます。
- 複数データベースカタログを使用している場合や外部システムと連携している場合、OutSystemsはシステムごとに別のトランザクションを開きます。これらは別々にコミットされ、分散トランザクションのメカニズムはありません。このため、トランザクション処理に格別の注意が必要な場合があります。