bigmac-jp blog

web開発関連のメモ

MySQL メモ4 ACID特性

ACID特性

MySQLに限らずその他のRDBMSでも、トランザクション処理に求める要件をACID特性と呼ばれる。
InnoDBストレージエンジンはACIDに準拠した設計になっている。

  • "A" Atomicity(原子性)

 トランザクション内での処理がすべて実行されるか、すべて実行されないかを保証すること。コミットされるかロールバックされるのかのどっちかとなる。一部の処理だけが実行されることがないよにしている。

  • "C" Consistency(一貫性)

 DBのルール、整合性に合わない処理が発生した場合に、そのトランザクションの実行は中止となる。

  • "I" Isolation(独立性)

 複数のトランザクションが実行中の場合に、各トランザクションは他のトランザクションへ影響を与えない、受けない独立性を持つこと。

  • "D" Durability(永続性)

 トランザクション処理が実行された結果は、データベースから失われないこと。

トランザクション分離レベル

ACID特性の中の独立性(Isolation)を、どれほどの独立性レベルで実行するかを定義したレベルをトランザクション分離レベルと呼ばれる。
分離レベルはANSI/ISO SQL標準で定められてるため、MySQL以外でも使われている。

分離レベル

ダーティーリード ファジーリード ファントムリード ロストアップデート 備考
READ UNCOMMITTED 発生 発生 発生 発生 あまり使われることはないらしい。
READ COMMITTED 起きない 発生 発生 発生 PostgreSQLOracleSQL Serverでデフォルトの設定
REPEATABLE READ 起きない 起きない 発生 発生 MySQLのデフォルト設定
SERIALIZABLE 起きない 起きない 起きない 起きない あまり使われることはないらしい。
ダーティーリード

コミットしていない変更が他のトランザクションから見える事象。

ファジーリード

コミットしていない変更(update)は他のトランザクションからは見えない。ただし、トランザクションの途中で、他のトランザクションがコミットした変更(update)は見えてしまう事象。

ファントムリード

コミットしていない変更(update)は他のトランザクションからは見えない。ただし、トランザクションの途中で、他のトランザクションがコミットした追加(insert)は見えてしまう事象。

ロストアップデート

複数のトランザクションが並列に更新した場合に、最後実行されたトランザクションの更新結果で上書きされる事象。