study-note

トランザクション

ストレージエンジンがInnoDBの場合

目次

トランザクションの開始・終了

START TRANSACTION;
BEGIN;

コミット

COMMIT;

ロールバック

ROLLBACK;

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

不整合の種類

  1. ダーティーリード:あるトランザクション操作でコミットが完了していない更新が、別のトランザクションから読めてしまう現象
  2. ファジーリード:トランザクション内で、他のトランザクションがCOMMITした行の変更が表示されてしまう現象
  3. ファントムリード:トランザクション内で、他のトランザクションがCOMMITした行の追加が表示されてしまう現象

分離レベル

  1. READ UNCOMMITTED
    • コミットされていないトランザクションの結果が、他のトランザクションから見えてしまう
    • ロールバックされるかもしれない、正確でない値も読み込んでしまう
  2. READ COMMITTED
    • トランザクションが開始された時点で既にコミットされている値だけが見える
    • その間に更新される可能性がある
    • トランザクション内で同じ問い合わせを2回繰り返された時、同じ結果が保証されない
  3. REPEATABLE READ
    • トランザクションが完了するまで共有ロックが継続され、一度読み取った値が他のトランザクションによって変更されることがない
    • トランザクション内で同じ問い合わせを2回繰り返された時、同じ結果が保証される
    • MySQL(InnoDB利用時)のデフォルト
  4. SERIAZABLE
    • すべてのトランザクションを逐次的に処理
    • 読み取るすべての行にロックを書けるので、ロック競合が多発することになる
    • このレベルが使用されることは少ない

分離レベルと不整合の対応

  1. READ UNCOMMITTED
    • ダーティーリード:起きる
    • ファジーリード:起きる
    • ファントムリード:起きる
  2. READ COMMITTED
    • ダーティーリード:起きない
    • ファジーリード:起きる
    • ファントムリード:起きる
  3. REPEATABLE READ
    • ダーティーリード:起きない
    • ファジーリード:起きない
    • ファントムリード:起きない(MySQL以外では起きるものもある)
  4. SERIALIZABLE
    • ダーティーリード:起きない
    • ファジーリード:起きない
    • ファントムリード:起きない

トランザクション分離レベルの確認・指定

分離レベルの確認

SELECT @@tx_isolation;

分離レベルの指定

SET [SESSION] TRANSACTION ISOLATION LEVEL <isolation_level>;