[データベース]
MySQLとトランザクション周り
トランザクション分離レベル
- トランザクションは1つの作業単位として扱う一連の操作の集まり
- トランザクション分離レベルはACID特性のI(Isolation、分離性)に関する概念で、他のトランザクションに影響を与えるレベルを意味する
- `READ UNCOMMITTED`:コミットされていない変更を他のトランザクションから参照できる
- **ダーティリード**、**ファジーリード**、**ファントムリード**が全て発生する
- `READ COMMITTED`:コミットされた変更を他のトランザクションから参照できる
- Oracle、PostgreSQL、SQL Serverのデフォルトのトランザクション分離レベル
- **ファジーリード**、**ファントムリード**が発生する
- `REPEATABLE READ`:コミットされた追加・削除を他のトランザクションから参照できる
- MySQLのデフォルトのトランザクション分離レベル
- **ファントムリード**が発生する
- MySQL(InnoDB)は`REPEATABLE READ`でも**ファントムリード**が発生しない
- `SERIALIZABLE`:強制的にトランザクションを順序付けて処理する(直列化)
- 読み取るすべての行に共有ロックをかける
- **ダーティリード**、**ファジーリード**、**ファントムリード**が全て発生しない
Springの@Transactionalアノテーションとの兼ね合い
- Springで@Transactionalアノテーションを使う際、何も指定しなければDBのデフォルト分離レベルでトランザクションが開始される