トランザクション分離レベルのメモです。
ANSI/ISO SQL 標準によって、4種類の分離レベルが定められています。
ANSI/ISO Level | for SQL | Dirty Read | Non-Repeatable Read (Fuzzy Read) | Phantom Read |
---|---|---|---|---|
READ UNCOMMITTED | UR | 〇 | 〇 | 〇 |
READ COMMITTED | CS | - | 〇 | 〇 |
REPEATABLE READ | RS | - | - | 〇 |
SERIALIZABLE | RR | - | - | - |
- 分離レベルが高くなるほどデータの一貫性は高くなります。
- 分離レベルが高くなるほどロック制御が厳しくなり待ち時間が長くなります。
- データベース毎にサポートしている分離レベルは異なります。
- データベースによっては、標準と異なる動作をするものがあります。
Problem | Overview |
---|---|
Dirty Read | T1の未コミットの更新内容が、T2から見えてしまう。 |
Non-Repeatable Read (Fuzzy Read) |
T1から複数回問い合わせした際に、T2のコミット前後で取得レコードの内容が異なってしまう。 T2のUpdate、Deleteの内容が反映される。 |
Phantom Read | T1から複数回問い合わせした際に、T2のコミット前後で取得レコードが異なってしまう。 T2のInsertの内容が反映される。 |
Database | Default isolation level |
---|---|
Oracle DB | READ COMMITTED |
Microsoft SQL Server | READ COMMITTED |
IBM DB2 | READ COMMITTED |
PostgreSQL | READ COMMITTED |
MySQL(InnoDB) | REPEATABLE READ |
Derby | READ COMMITTED |
H2 | READ COMMITTED |
Database (JDBC driver) | Default isolation level |
---|---|
Oracle DB | READ COMMITTED |
Microsoft SQL Server | REPEATABLE READ |
IBM DB2 | REPEATABLE READ |
Derby | REPEATABLE READ |