My Photo

« 2012年4月新アニメ雑感 #anime | Main | MySQLメモ007:便利なSQL文 その1 »

April 22, 2012

MySQLメモ006:トランザクション

AUTO COMMIT

MySQLはデフォルトではSQL文を実行するたびに自動的にコミットする。これをAUTO COMMITモードと呼ぶ。
AUTO COMMITかどうかの参照、AUTO COMMITの有効/無効はシステム変数 AUTOCOMMIT で行う。

AUTO COMMITが有効の場合、トランザクションを開始するには BEGIN または START TRANSACTION が必要で、COMMIT または ROLLBACK でトランザクションが終了する。
AUTO COMMITが無効の場合、BEGIN や START TRANSACTION は不要で自動的にトランザクションが開始され、COMMIT または ROLLBACK でトランザクションが終了する。

mysql> SELECT @@autocommit;
+--------------+
| @@autocommit |
+--------------+
|            1 |
+--------------+
1 row in set (0.00 sec)

mysql> SELECT * FROM t3;
Empty set (0.00 sec)

mysql> START TRANSACTION;
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO t3 VALUES ('a');
Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM t3;
+------+
| col1 |
+------+
| a    |
+------+
1 row in set (0.00 sec)

mysql> ROLLBACK;
Query OK, 0 rows affected (0.05 sec)

mysql> SELECT * FROM t3;
Empty set (0.00 sec)

mysql> START TRANSACTION;
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO t3 VALUES ('b');
Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM t3;
+------+
| col1 |
+------+
| b    |
+------+
1 row in set (0.00 sec)

mysql> COMMIT;
Query OK, 0 rows affected (0.05 sec)

mysql> SELECT * FROM t3;
+------+
| col1 |
+------+
| b    |
+------+
1 row in set (0.00 sec)

トランザクション分離レベル

トランザクション分離レベルとは、あるトランザクションが行った変更を他のトランザクションがどの段階で読み取れるようになるのかを定めたもの。ISOでは以下の4つを定めている。

READ UNCOMMITTED
あるトランザクションでのコミットしていない変更を、他のトランザクションから読める。
READ COMMITED
あるトランザクションでのコミットしていない変更は、他のトランザクションから読めない。コミットした変更は読める。
REPEATABLE READ
他のトランザクションで値を変更しても、1つのトランザクションの同じ場所は常に同じ値を返す。
SERIALIZABLE
トランザクションを1つ1つ順に実行していく。最もデータの整合性は高いがロック待ち時間も多くなる。

InnoDBでのデフォルトは REPEATABLE READ である。

SAVE POINT

InnoDBにはトランザクションの特定の位置まで戻るためのSAVE POINTが実装されている。
以下の文でSAVE POINTをセットする。

SAVEPOINT <名前>

以下の文でSAVE POINTまで戻る。

ROLLBACK [WORK] TO [SAVEPONT] <名前>

mysql> START TRANSACTION;
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO t3 VALUES ('c');
Query OK, 1 row affected (0.00 sec)

mysql> SAVEPOINT sp1;
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO t3 VALUES ('d');
Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM t3;
+------+
| col1 |
+------+
| b    |
| c    |
| d    |
+------+
3 rows in set (0.00 sec)

mysql> ROLLBACK TO sp1;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT * FROM t3;
+------+
| col1 |
+------+
| b    |
| c    |
+------+
2 rows in set (0.00 sec)

mysql> COMMIT;
Query OK, 0 rows affected (0.03 sec)

mysql> SELECT * FROM t3;
+------+
| col1 |
+------+
| b    |
| c    |
+------+
2 rows in set (0.00 sec)

暗黙的にコミットを実行する文

以下の文は実行すると暗黙的にコミットする。

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

« 2012年4月新アニメ雑感 #anime | Main | MySQLメモ007:便利なSQL文 その1 »

MySQL」カテゴリの記事

Comments

Post a comment

(Not displayed with comment.)

TrackBack

TrackBack URL for this entry:
http://app.cocolog-nifty.com/t/trackback/26461/54537614

Listed below are links to weblogs that reference MySQLメモ006:トランザクション:

« 2012年4月新アニメ雑感 #anime | Main | MySQLメモ007:便利なSQL文 その1 »

April 2017
Sun Mon Tue Wed Thu Fri Sat
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30            
無料ブログはココログ

日本blog村

  • にほんブログ村 IT技術ブログへ
  • にほんブログ村 アニメブログへ
  • にほんブログ村 サッカーブログ アルビレックス新潟へ

好きな音楽家

メモ

XI-Prof