【忘備録】InnoDBでもロールバックが効かない文


[ad#co-1]

普段はMySQLを使用している筆者ですが、改めてMySQLを0から学びなおしているので、その忘備録をつらつらと。
間違ってる箇所があるかもしれないので、その際はご指摘いただければと思います。

そもそもMySQLはDBではない

まぁそうですよね。
ちゃんと言えば、RDBMS(リレーショナルデータベースマネジメントシステム)のことです。
クライアントからリクエストが飛んできてからがRDBMSのお仕事。

1. コネクションプールで認証や接続、スレッド処理を行う。
2-1. パーサーでSQLクエリの解析や最適化を行う。
2-2. キャッシュでSQLクエリと結果をキャッシュする。
3. ストレージエンジンでデータの読み書きを行う。
4. ストレージファイルにデータを保存する。

その一連の流れをマネジメントしているのがRDBMSです。

 

大体はInnoDBがストレージエンジン

以前はMySQLの標準のストレージエンジンはMyISAMだったらしいが、バージョン5.5からはInnoDBへ。
他にもいくつかあるみたいですが、基本的にはこの2つ。
それぞれ使い道があるんですが、現在は基本的にはInnoDBばかり。
MyISAMがよかれと思われていたのは全文検索などができるとか、高速とからしい。
ただ、それは用途がBIとかだったのでしょう。

現在はデータウェアハウスやデータマートの概念が普及し、用途に応じたNoSQLが使われることが多いのではないでしょうか。
例えばRedShiftとかですかね。
なので、基本はInnoDBでokだと思います。

[ad#co-2]

で、ロールバックが効かない文は?

つらつらとタイトルに関係のない話をしてきましたが、やっとトランザクションとかロールバックのお話。
前提として、InnoDBはAutoCommitモードがデフォルトです。
AutoCommitモードとは、明示的にトランザクションの開始宣言をしなければ勝手にコミットされるということです。

AutoCommitがONのとき

update profile set birthdate = ‘1991-03-12’ where name = ‘tanaka’;

これだけでコミットされます。
もし、コミットかロールバックか選ぶ際は下記のように書きます。

begin;
update profile set birthdate = ‘1991-03-12’ where name = ‘tanaka’;
rollback;

beginの代わりにstart transactionという風にもかけます。
ではOFFの場合はどうなるかというと、開始は勝手に始まります。
ただ、終わりはcommitまたはrollbackを書かなければ終わりません。
また、そのどちらかを書けばまたすぐに次のトランザクションが開始されます。
以下が例になります。

update profile set birthdate = ‘1991-03-12’ where name = ‘tanaka’;
commit;
update profile set birthdate = ‘1991-07-22’ where name = ‘suzuki’;
rollback;

ONとOFFの切り替えはset autocommit文を実行します。

set autocommit=1; //これでONになります。
set autocommit=0; //これでOFFになります。

やっと本題ですが、ここはまさかのさらっと終わります。笑
ロールバックが効かない文がいくつかあります。
それが下記になります。

ALTER TABLE
BEGIN
CREATE INDEX
DROP DATABASE
DROP INDEX
DROP TABLE
LOAD MASTER DATA
LOCK TABLES
RENAME TABLE
SET AUTOCOMMIT=1
START TRANSACTION
TRUNCATE TABLE

はい!以上です。笑
それぞれの文の意味は説明いたしません。
調べたらすぐに出てきますので。笑

些細な忘備録なはずがダラダラかいてしまった…
なにかの足しになればと思います。


Tags: