InnoDBのIsolationLevel

InnoDBのデフォルトIsolationLevelは、Repeatable Readだ。Oracle使いな人には、最初ちょっと戸惑うかもしれないけど、私はこれがデフォルトになってくれている方が自然な気がするので、賛成派である。

んでこのRepeatable Readは通常とは少し違っており、Phantom Readが発生しないようになっている。これは始め、「ウソだろ?」と疑ってかかったが、確かに試してみると、Phantom Readが発生しない。

以下、私の実験をご紹介します。
autocommit=1
トランザクションA:赤
トランザクションB:青


create table t(id int);
insert into t values(1),(5);
begin;
select * from t; -- (1)
+----+
| id |
+----+
| 1 |
| 5 |
+----+

insert into t values(10); -- (2)
select * from t; -- (3)
+----+
| id |
+----+
| 1 |
| 5 |
+----+ <-- 10 が出てこない!!

rollback;
select * from t;
+----+
| id |
+----+
| 1 |
| 5 |
| 10 | <-- 出てくる
+----+

(3) で、10が出てこないのが非常に驚きです。もちろん、Read Committed なIsolation Levelなら、10 が出てきます。

あと、(1) と (2) のタイミングが逆なら、Repeatable Read でも、10 が出てきます。MySQL(というかInnoDB)の Repeatable Read は、厳密にRepeatable Read なのです。