ストレージエンジンの違いによるトランザクションの扱い
トランザクションについては概要くらいであまり詳細な調査をしていなかったのでやってみた
ここではmysql5.1.22-rcを使用する
機会があれば第三のストレージエンジン(※1)も調査してみたいが
mysql6のFalconや第三のストレージエンジンは使用しない
まずはInnoDB
画面1でテーブル作成&トランザクション開始
mysql> create table t7 (id int(9) unsigned not null auto_increment primary key) engine='Innodb';
Query OK, 0 rows affected (0.02 sec)mysql> SET AUTOCOMMIT=0;
Query OK, 0 rows affected (0.00 sec)
画面2でテーブル作成を確認&トランザクション開始
mysql> show create table t7\G
Table: t7
Create Table: CREATE TABLE `t7` (
`id` int(9) unsigned NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)mysql> SET AUTOCOMMIT=0;
Query OK, 0 rows affected (0.00 sec)
画面1でデータインサート
mysql> insert into t7 select 1;
Query OK, 1 row affected (0.00 sec)
画面2で確認
この時点では常識ではこうなると思う
mysql> select * from t7;
Empty set (0.00 sec)
画面1でコミット&確認
mysql> COMMIT;
Query OK, 0 rows affected (0.00 sec)mysql> select * from t7;
-
-
-
-
- +
-
-
-
id |
-
-
-
-
- +
-
-
-
1 |
-
-
-
-
- +
-
-
-
1 row in set (0.00 sec)
画面2で確認
ここでもempty!
mysql> select * from t7;
Empty set (0.01 sec)
今度は画面2でコミット&確認
mysql> commit;
Query OK, 0 rows affected (0.00 sec)mysql> select * from t7;
-
-
-
-
- +
-
-
-
id |
-
-
-
-
- +
-
-
-
1 |
-
-
-
-
- +
-
-
-
1 row in set (0.00 sec)
となる
Innodbはコミットされない限りはトランザクション開始した時点のデータが取得でき
他には影響されない模様
次にndbcluster
画面1でテーブル作成
mysql> create table t8 (id int(9) unsigned not null auto_increment primary key) engine='ndbcluster'
-> ;
Query OK, 0 rows affected (0.85 sec)
画面2で確認
mysql> show create table t8\G
Table: t8
Create Table: CREATE TABLE `t8` (
`id` int(9) unsigned NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`)
) ENGINE=ndbcluster DEFAULT CHARSET=utf8
1 row in set (0.00 sec)mysql> select * from t8;
Empty set (0.00 sec)
画面1でデータインサート
mysql> insert into t8 select 1;
Query OK, 1 row affected (0.00 sec)
画面2で確認
mysql> select * from t8;
Empty set (0.00 sec)
画面1でコミット
mysql> commit;
Query OK, 0 rows affected (0.00 sec)
画面2で確認
mysql> select * from t8;
-
-
-
-
- +
-
-
-
id |
-
-
-
-
- +
-
-
-
1 |
-
-
-
-
- +
-
-
-
1 row in set (0.00 sec)
お!InnoDBと挙動が違う!
InnoDBの場合画面?でコミットして初めてデータの確認が出来るのが
ndbclusterの場合他のトランザクションのコミットに影響されちゃうのか
ちょっと前までndbclusterの開発やってたけど設定とかチューニングとか苦労したもんなぁ・・・
こういうこと分かってないでndbclusterをチョイスしちゃうのはダメですね
うん