MySQLのイケてない仕様 - トランザクション編

カテゴリ: WEB、WEBシステム関連 / 公開日: 2010年6月11日(金曜)01:52 / 投稿者: Tom Goodsun

前回に続きMySQLのイケてない仕様を紹介。
今回はトランザクション。DBをよく使う肩ならご存知かと思う。
トランザクションとはシステムの分野では、「分ける事の出来ない一連の情報処理の単位」とWikipediaに書いてある。

たとえば、DBテーブルにデータを追加しようとする。
すると次のプロセスが同じようにデータを書き込んでしまうと、ひとつ前に追加したデータを何らかの理由ですぐに元に戻したいときに特定できなくなってしまう。

トランザクションという仕組みを使うと、データを追加(INSERT)したり、変更(UPDATE)したり、削除(DELETE)したりするSQLの結果を、明示的に確定(COMMIT)しない限り反映されないし、トランザクション中の変更は元に戻す(ROLLBACK)ことができる。
これは非常に重要な機能で、何万件ものデータを取り扱うときには取り返しが付かなくなる前にとりあえず元に戻すこともできる。

老舗のOracleをはじめPostgreSQLなどは、INSERTやUPDATE、DELETEを実行すると自動的にトランザクションが開始され、COMMITがROLLBACKが実行されるまで維持される。

この仕様がDBでは一般的なはずだが、MySQLではそれがない。正確にはトランザクション自体は存在する。

MySQLではそのまま、INSERT、UPDATE、DELETEを実行するとデータは確定されてしまう。これをAUTOCOMMIT(自動コミット)というらしい。
MySQLではトランザクションを実行する際は明示的にトランザクションの開始を実行しなければならない。

参考URL http://dev.mysql.com/doc/refman/4.1/ja/commit.html

START TRANSACTION;
-- または(どちらも同じ)
BEGIN;

トランザクションの終了はもちろんCOMMITかROLLBACK。
だからプログラムで書くときはこれを忘れがちなので、気をつけよう。

この仕様はOracleみたいに自動的にトランザクションを開始するように変更できる。つまり自動コミットをOFFにできる。

SQLレベルでやるなら以下の方法。

-- 現在の設定値を確認(0:自動コミットOFF 1:自動コミットON)
SELECT @@autocommit;

-- 自動コミットをOFFに設定
SET AUTOCOMMIT = 0;

ちなみにmy.cnfにも記述できるみたいだ。

参考URL OpenGroove - MySQLのAUTOCOMMIT(オートコミット)覚え書き

っていうか、何でなんでしょうね。
Oracleに買収されたからこの辺も変わってくるのかな?