りんちゃんの日記

日常を書き留めていきます。

MySQL トランザクション

1. InnoDB


 トランザクションを行うにはテーブルをInnoDBにする。
 テーブル作成時、デフォルトでInnoDBにするにはconfを編集する必要がある。
トランザクションを使うテーブルはInnoDBにしておく必要がある。


2. my.cnfの設定
 [mysqld]に「default-storage-engine=InnoDB」を追加

 2.1. my.cnfを編集する(赤文字の箇所追加)
    # touch /root/dum.sh

  [mysqld]
  datadir=/var/lib/mysql
  socket=/var/lib/mysql/mysql.sock
  user=mysql

  log=/var/log/mysql/mysql_query.log

  # Disabling symbolic-links is recommended to prevent assorted security risks
  symbolic-links=0


  default-character-set=utf8
  character-set-server=utf8
  skip-character-set-client-handshake

  default-storage-engine=InnoDB <-- 追加

  [client]
  default-character-set=utf8

  [mysqld_safe]
  log-error=/var/log/mysqld.log
  pid-file=/var/run/mysqld/mysqld.pid

 

 2.2. サービス再起動
   # service mysqld restart

 


3. MySQL、Engine確認

 3.1. Transactions項目を確認
 Transactions項目がYESであればトランザクションが有効である。
    # mysql> show engines ;
    結果
  +------------+---------+------------------------------------------------------------+--------------+------+------------+
  | Engine | Support | Comment | Transactions | XA | Savepoints |
  +------------+---------+------------------------------------------------------------+--------------+------+------------+
  | MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO |
  | CSV | YES | CSV storage engine | NO | NO | NO |
  | MyISAM | DEFAULT | Default engine as of MySQL 3.23 with great performance | NO | NO | NO |
  | InnoDB | YES | Supports transactions, row-level locking, and foreign keys | YES | YES | YES |
  | MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO |
  +------------+---------+------------------------------------------------------------+--------------+------+------------+

 3.2. テーブルのEngineを確認
 
EngineがInnoDBであればトランザクションが有効である
 mysql> show table status where name = 'tra' \G; 

  結果
  *************************** 1. row ***************************
  Name: tra
  Engine: InnoDB ←ここ
  Version: 10
  Row_format: Compact
  Rows: 1
  Avg_row_length: 16384
  Data_length: 16384
  Max_data_length: 0
  Index_length: 0
  Data_free: 4194304
  Auto_increment: NULL
  Create_time: 2014-07-16 23:52:12
  Update_time: NULL
  Check_time: NULL
  Collation: utf8_general_ci
  Checksum: NULL
  Create_options:
  Comment:
  1 row in set (0.00 sec)


 ※MyISAMのテーブルをInnoDBに変更するには
 ALTER TABLE <table名> ENGINE=InnoDB;

 

 3.3. AUTO COMMITモードの確認
 
トランザクションが有効かどうか
 mysql> SELECT @@autocommit;

  結果

  1:トランザクション有効
  0:トランザクション無効


4. トランザクションのテスト実行

 4.1. テストテーブル作成
    mysql> create table tra (tname varchar(20));

 4.2. トランザクション開始
    mysql> START TRANSACTION;

 4.3. データ挿入
    mysql> insert into tra values ('hogehoge');

  結果

  select * from tra;
  +----------+
  | tname |
  +----------+
  | hogehoge |
  +----------+

 4.4. ロールバック
    mysql> ROLLBACK;

 4.5. データを確認(空である)
 mysql> select * from tra;

  結果
  Empty set (0.00 sec)

 

 4.5. データ挿入
 mysql> insert into tra values ('hogehoge');

 4.4. コミット
    mysql> COMMIT;

 4.5. データを確認(追加されている)

 mysql> select * from tra;

  結果

  +----------+
  | tname |
  +----------+
  | hogehoge |
  +----------+