MySQL の分離レベルとか自動コミットとか
今回は分離レベルの話と自動コミットについて雑多なメモを。
分離レベル
MySQL InnoDB のデフォルト分離レベルは REPEATABLE-READ になっています。
このモードはダーティーリードは禁止するものの、ファントムリードなどは発生するというやつで、 4つの分離レベルの中で2番目に厳しいトランザクション独立性を持ちます。
- READ UNCOMMITTED
- READ COMMITTED
- REPEATABLE READ
- SERIALIZABLE
でも僕は READ COMMITED を使うことが多いです。 理由はパフォーマンスです。
また、READ COMMITED の場合、コミットされたデータは別のトランザクションから参照可能です。 これにより、別トランザクション内でも無駄にクエリを発行することを防いだりすることができたりするメリットもあります。
自動コミット
MySQL には自動コミットというのがあります。 これが有効の場合、更新系クエリは即座にコミットされてしまいます。 一方トランザクションを使うと、明示的に commit, rollback をしない限り更新が確定されません。
これは複数処理を一つのトランザクションとして all or nothing を実現したいときに便利です。 (Webアプリケーションを作成するときによく見かける方針だと思います。)
それで、これを命令するのが
start transaction, begin, set autocommit = 0
だったりします。
一つの起動プロセスの中で何度かトランザクション処理をするときには AUTO COMMIT モードをOFFにしてしまったほうがらくだと思います。
そういう時には
select @@autocommit; set autocommit = 0 select @@autocommit;
とかで確認、設定してしまって、トランザクション処理を行うのがオススメです。
一方で一つのトランザクション処理しかしないよー、という場合には、 start transaction とか begin を使うのもいいと思います。
このへんはおこのみですね。