このページの2つのバージョン間の差分を表示します。
両方とも前のリビジョン 前のリビジョン 次のリビジョン | 前のリビジョン 次のリビジョン 両方とも次のリビジョン | ||
mariadb:10.4:transaction [2020/10/20 17:44] y2sunlight |
mariadb:10.4:transaction [2020/11/19 17:10] y2sunlight [MySQLi による手動トランザクション] |
||
---|---|---|---|
行 1: | 行 1: | ||
====== MariaDB10.4 トランザクション ====== | ====== MariaDB10.4 トランザクション ====== | ||
+ | phpMyAdmin 4.9.0.1 (MariaDB 10.4.6) | ||
+ | |||
--- // | --- // | ||
行 5: | 行 7: | ||
関連記事 | 関連記事 | ||
- | * [[xampp: | ||
* [[mariadb: | * [[mariadb: | ||
* [[mariadb: | * [[mariadb: | ||
行 12: | 行 13: | ||
* MariaDB10.4 トランザクション | * MariaDB10.4 トランザクション | ||
- | 以下「MySQL」は「MariaDB」に読み替えて下さい | + | 以下「MySQL」は「MariaDB」に読み替えて下さい。 |
---- | ---- | ||
- | MySQLではトランザクションセーフなテーブル(InnoDBなど)と非トランザクションセーフなテーブル(MyISAMなど)を作る事ができます。手動トランザクションが使えるのはトランザクションセーフなテーブルだけです。 MyISAMなどの非トランザクションセーフなテーブルの場合は、データベースの変更は直ちにコミットされます。本章ではストレージエンジンとしてInnoDBを使ったテーブルを対象とします。 | + | ===== 概要 ===== |
+ | |||
+ | MySQLではトランザクションセーフなテーブル(InnoDBなど)と非トランザクションセーフなテーブル(MyISAMなど)を作る事ができます。手動トランザクションが使えるのはトランザクションセーフなテーブルだけです。 MyISAMなどの非トランザクションセーフなテーブルの場合は、データベースの変更は直ちにコミットされます。 | ||
+ | |||
+ | 本章ではストレージエンジンとしてInnoDBを使ったテーブルを対象として、トランザクションについて説明します。InnoDBでは、以下のトランザクション分離レベルをサポートしています: | ||
+ | |||
+ | * READ UNCOMMITTED --- 非コミット読み取り | ||
+ | * READ COMMITTED --- コミット済み読み取り | ||
+ | * REPEATABLE READ --- 再読み込み可能読み取り | ||
+ | * SERIALIZABLE --- 直列化 | ||
+ | |||
+ | ここでは、これらの分離レベルの違いをサンプルプログラムを使用して実感しながら説明したいと思います。 | ||
+ | |||
+ | \\ | ||
- | ==== MySQLのトランザクション ==== | + | ===== MySQLのトランザクション |
MySQLはデフォルトで自動トランザクション機能(自動コミットモード)が有効です。本編ではMySQLiを使っているので、プログラムの途中で自動コミットモードを切り替える場合は、次のようにします。 | MySQLはデフォルトで自動トランザクション機能(自動コミットモード)が有効です。本編ではMySQLiを使っているので、プログラムの途中で自動コミットモードを切り替える場合は、次のようにします。 | ||
行 80: | 行 94: | ||
> [[https:// | > [[https:// | ||
- | ==== SQL文による手動トランザクション ==== | + | \\ |
+ | |||
+ | ===== SQL文による手動トランザクション ===== | ||
ブラウザからサンプルプログラム(sqlfile.php)を実行します。 | ブラウザからサンプルプログラム(sqlfile.php)を実行します。 | ||
行 125: | 行 142: | ||
この例で、START TRANSACTION文を1行目に移動して実行すると、奇妙な現象が起こります。ロールバックが効かなくなるのです。これは、DROP TABLE文により暗黙のコミットが発生してトランザクションが終了している為です。それ以降は自動コミットモードになるのでROLLBACK文は無効になります。この現象はDROP TABLEやCREATE TABLEなどのDDL文の場合に発生します。トランザクションを設計する場合は注意する必要があります。 | この例で、START TRANSACTION文を1行目に移動して実行すると、奇妙な現象が起こります。ロールバックが効かなくなるのです。これは、DROP TABLE文により暗黙のコミットが発生してトランザクションが終了している為です。それ以降は自動コミットモードになるのでROLLBACK文は無効になります。この現象はDROP TABLEやCREATE TABLEなどのDDL文の場合に発生します。トランザクションを設計する場合は注意する必要があります。 | ||
- | ==== MySQLi による手動トランザクション ==== | + | \\ |
+ | |||
+ | ===== MySQLi による手動トランザクション | ||
ブラウザからサンプルプログラム(sqlfile.php)を実行します。 | ブラウザからサンプルプログラム(sqlfile.php)を実行します。 | ||
行 162: | 行 181: | ||
上のスクリプトファイルにはEVAL文が含まれています。EVALに続く式(例えば:$mysqli-> | 上のスクリプトファイルにはEVAL文が含まれています。EVALに続く式(例えば:$mysqli-> | ||
- | 実行結果 | + | === 実行結果 |
[{{: | [{{: | ||
行 171: | 行 190: | ||
MySQLiを利用してデータベースをアクセスする場合、移植性による理由から、begin_transaction/ | MySQLiを利用してデータベースをアクセスする場合、移植性による理由から、begin_transaction/ | ||
+ | |||
+ | \\ | ||
==== トランザクションの分離レベル ==== | ==== トランザクションの分離レベル ==== |