RAD Studio 10.4より前のバージョンでは、FireDAC接続のトランザクション分離レベル(以下、分離レベル)のオプションのデフォルトは、読み取りコミットでした。 (TFDTxOptions.Isolationのデフォルト値は、xiReadCommittedに設定)

FireDACでは、デフォルト値が変更されていない場合、コンポーネントに設定されたデフォルト値がデータベースのデフォルト値であると仮定して、セッションの開始時に明示的に分離レベルを変更するコマンドをデータベースへ送信しませんでした。例えば、MySQLでは、デフォルト値が変更されていない場合、SET SESSION TRANSACTION ISOLATION LEVELという分離レベルの変更に必要なコマンドが実行されませんでした。そのためTFDTxOptions.Isolationのプロパティ値に何を設定しても、MySQLの分離レベルはデータベースのデフォルト値である" xiRepeatableRead "のまま変わらないという問題がありました。

10.4で、この問題を解決するために、TFDTxOptions.Isolationのデフォルト値を "xiReadCommitted"から"xiUnspecified" に変更する方が適切であると判断しました。これによって分離レベルの変更が必要ない場合は、データベース側でデフォルト設定されている分離レベルをそのまま使用します。なお、分離レベルはデータベース側で既に設定されているため、改めて設定する必要はありません。 ただし、デフォルトの分離レベルは、データベースごとに異なり、個別に最適化されているため、FireDACで設定した分離レベルは、全てのデータベースエンジンでサポートされているわけではありません。

そのため、もし開発者がデータベースの使用するデフォルトと異なる分離レベルを使用したい場合は、FireDACコンポーネント、または実装コードで明示的に分離レベルを設定する必要があります。(データベースのデフォルトを使用する場合、これらの設定は不要です。)

10.4でのTFDTxOptions.Isolationのデフォルト値はxiUnspecifiedですが、FireDACのIsolationのプロパティ値の表記に合わせた際の各データベースのデフォルトの分離レベルは、以下の通りです。

DB2 - xiReadCommitted
InterBase and Firebird - xiSnapshot
MySQL and MariaDB - xiRepeatableRead
Oracle - xiReadCommitted
Microsoft SQL Server - xiReadCommitted
SQLite - xiSerializible
PostgreSQL - xiReadCommitted

上述いたしました変更点は、RAD Studio 10.4 のリリースノートには記載されておらず、いくつかの懸念事項(およびバグレポートでの報告)となっていました。このブログで、10.4での変更点を明確にし、その回避方法を示すことで、開発者が利用するデータベースに合わせて、FireDACのトランザクション分離レベルを適切に変更するための情報として役立つことを願っています。

Reduce development time and get to market faster with RAD Studio, Delphi, or C++Builder. Design. Code. Compile. Deploy.

Start Free Trial   Free Delphi Community Edition   Free C++Builder Community Edition   Upgrade Today  

Anonymous