本エントリはFirebird Advent Calendar 2014の18日目です。nakagamiさんによる(17日目はこちら)でまだまだ参加者募集中。
さてFirebirdのトランザクション内部構造に踏み入る前に、Firebirdのトランザクションの特性を他のRDBMSのものと比較してみます。
主要なRDBMSがサポートする分離レベルとデフォルト値
よくRead CommittedはRC, Repetable ReadはRRと省略されて利用されることがあります。
注:*1IBM DB2では分離レベルの名称がすべて(FirebirdではREAD COMMITTED以外の名称が)ANSI SQLとは違っています。対応は以下のようになります。
ANSI SQL 分離レベルでいえば、リピータブルリードはIBM DB2のRS相当です。(IBM DB2のRRではありません)
注:*2 OracleとMySQL 5.6以降にはANSI SQLでは定義されていない分離レベルの読み取り専用のトランザクションがあり、書込ができないこと以外はリピータブルリードの特殊な形(トランザクション開始時の内容が、その後のクエリで取得できる。)と考えていいでしょう。読み込み動作としてはMySQL(InnoDB)のSTART TRANSACTION WITH CONSISTENT SNAPSHOT;をREPEATABLE READで発行するのと同様なものとなります。FirebirdにもREAD ONLYの指定がありますが、これは単純に各分離レベルに対しての属性として付加されます。
注:*3 PostgreSQL 9.0まではリピータブルリードはありませんでした。9.1にて「真のシリアライザブル」がサポートされ、それがシリアライザブルになり、9.0までのシリアライザブルはリピータブルリードとなりました。
注:*4 DB2とSQL Serverのリードコミットには、それぞれ従来の動作とは別にMVCC相当動作の指定が可能です。
FirebirdでTransactionの話をすると独特な用語(OIT, OAT, OST)や考え方があるので、まずは以下のドキュメントで大まかに確認してみてください。
Understanding InterBase Transactions
PlanetMySQL Voting: Vote UP / Vote DOWN
さてFirebirdのトランザクション内部構造に踏み入る前に、Firebirdのトランザクションの特性を他のRDBMSのものと比較してみます。
主要なRDBMSがサポートする分離レベルとデフォルト値
凡例) ◎デフォルト値, ○サポート, −未サポート, ↓指定すると、次のレベルで動作
------------------------------------------------------------------------------------------------
ANSI SQL 分離レベル Oracle MySQL(InnoDB) PostgreSQL IBM DB2*1/MS SQL Server Firebird*1
------------------------------------------------------------------------------------------------
リードアンコミッテッド − ○ ↓ ○ −
リードコミッテッド ◎ ○ ◎ ◎*4 ○
リピータブルリード − ◎ ○*3 ○ ◎
(READ ONLY*2) ○ ○ − − −
シリアライザブル ○ ○ ○ ○ ○
-------------------------------------------------------------------------------------------
よくRead CommittedはRC, Repetable ReadはRRと省略されて利用されることがあります。
注:*1IBM DB2では分離レベルの名称がすべて(FirebirdではREAD COMMITTED以外の名称が)ANSI SQLとは違っています。対応は以下のようになります。
------------------------------------------------------------------------
ANSI SQL 分離レベル IBM DB2 Firebird
------------------------------------------------------------------------
リードアンコミッテッド: Uncommited read(UR) 未サポート
リードコミッテッド: Cursor stability(CS) READ COMMITTED
リピータブルリード: Read stability(RS) SNAPSHOT
シリアライザブル: Repeatable read(RR) SNAPSHOT TABLE STABILITY
------------------------------------------------------------------------
ANSI SQL 分離レベルでいえば、リピータブルリードはIBM DB2のRS相当です。(IBM DB2のRRではありません)
注:*2 OracleとMySQL 5.6以降にはANSI SQLでは定義されていない分離レベルの読み取り専用のトランザクションがあり、書込ができないこと以外はリピータブルリードの特殊な形(トランザクション開始時の内容が、その後のクエリで取得できる。)と考えていいでしょう。読み込み動作としてはMySQL(InnoDB)のSTART TRANSACTION WITH CONSISTENT SNAPSHOT;をREPEATABLE READで発行するのと同様なものとなります。FirebirdにもREAD ONLYの指定がありますが、これは単純に各分離レベルに対しての属性として付加されます。
注:*3 PostgreSQL 9.0まではリピータブルリードはありませんでした。9.1にて「真のシリアライザブル」がサポートされ、それがシリアライザブルになり、9.0までのシリアライザブルはリピータブルリードとなりました。
注:*4 DB2とSQL Serverのリードコミットには、それぞれ従来の動作とは別にMVCC相当動作の指定が可能です。
FirebirdでTransactionの話をすると独特な用語(OIT, OAT, OST)や考え方があるので、まずは以下のドキュメントで大まかに確認してみてください。
Understanding InterBase Transactions
JUGEMテーマ:コンピュータ
PlanetMySQL Voting: Vote UP / Vote DOWN