MySQLトランザクション処理の使用方法とサンプルコードの詳細な説明

MySQLトランザクション処理の使用方法とサンプルコードの詳細な説明

MySQL トランザクション サポートは、MySQL サーバー自体にバインドされているのではなく、ストレージ エンジンに関連しています。

1.MyISAM: トランザクションをサポートしておらず、パフォーマンスを向上させるために読み取り専用プログラムに使用されます。
2. InnoDB: ACIDトランザクション、行レベルロック、同時実行性をサポート
3. Berkeley DB: トランザクションのサポート

トランザクションとは、単一の作業単位であるかのように実行される、連続した一連のデータベース操作です。つまり、グループ内の個々の操作がすべて成功しない限り、トランザクションは完了しません。トランザクション内のいずれかの操作が失敗すると、トランザクション全体が失敗します。
実際には、多数の SQL クエリを 1 つのグループにまとめ、トランザクションの一部としてそれらすべてをまとめて実行します。

取引の特徴:

トランザクションには次の 4 つの標準プロパティがあり、多くの場合、ACID という頭字語で呼ばれます。

原子性: 作業単位内のすべての操作が正常に完了することを保証します。そうでない場合、トランザクションは障害時点で中止され、以前の操作は以前の状態にロールバックされます。

一貫性: トランザクションが成功した後にデータベースの状態が正しく変更されることを確認します。

分離: トランザクション操作を独立かつ透過的にします。

耐久性: システム障害が発生した場合でも、コミットされたトランザクションの結果または効果が持続することを保証します。

MySQL では、トランザクションは COMMIT または ROLLBACK ステートメントを使用して開始および終了します。ステートメントの開始と終了の SQL コマンド間に大規模なトランザクションが形成されます。

コミットとロールバック:

commit と rollback という 2 つのキーワードは、主に MySQL トランザクションに使用されます。

トランザクションが正常に完了したら、COMMIT コマンドを発行すると、関係するすべてのテーブルへの変更が有効になります。

障害が発生した場合は、トランザクションで参照されるすべてのテーブルを以前の状態に戻すために、ROLLBACK コマンドを発行する必要があります。

AUTOCOMMIT というセッション変数を設定することで、トランザクションの動作を制御できます。 AUTOCOMMIT が 1 (デフォルト) に設定されている場合、すべての SQL ステートメント (トランザクション内かどうかに関係なく) は完全なトランザクションと見なされ、完了時にデフォルトでコミットされます。 AUTOCOMMIT が 0 に設定され、SET AUTOCOMMIT = 0 コマンドが発行されると、明示的な COMMIT ステートメントが発行されるまで、後続の一連のステートメントはアクティブなコミットなしでトランザクションのように動作します。

これらの SQL コマンドは、mysql_query() 関数を使用して PHP で実行できます。

一般的な取引例

この一連のイベントは、使用されるプログラミング言語に依存せず、アプリケーションのロジック パスを作成するために使用される任意の言語で構築できます。

これらの SQL コマンドは、mysql_query() 関数を使用して PHP で実行できます。

BEGIN WORKはトランザクションを開始し、SQLコマンドを発行します。

SELECT、INSERT、UPDATE、DELETEなどの1つ以上のSQLコマンドを発行する

エラーがないか、すべてが要件どおりであるかどうかを確認します。

エラーがある場合は ROLLBACK コマンドを発行し、それ以外の場合は COMMIT コマンドを発行します。

MySQL のトランザクションセーフなテーブルタイプ:

MySQL トランザクション プログラミングを使用する予定の場合は、特別な方法でテーブルを作成する必要があります。トランザクションをサポートするテーブル タイプは多数ありますが、最も人気があるのは InnoDB です。

MySQL をソースからコンパイルする場合、InnoDB テーブルのサポートには特定のコンパイル パラメータが必要です。ご使用の MySQL バージョンに InnoDB のサポートがない場合は、インターネット サービス プロバイダーに依頼して、InnoDB テーブル タイプをサポートするバージョンの MySQL をビルドするか、Windows または Linux/UNIX 用の MySQL-Max バイナリ ディストリビューションをダウンロードしてインストールし、開発環境でテーブル タイプを使用してください。

MySQL インストールが InnoDB テーブルをサポートしている場合は、テーブル作成ステートメントに TYPE=InnoDB 定義を追加するだけです。たとえば、次のコードは InnoDB テーブル tcount_tbl を作成します。

root@host#mysql -u root -p パスワード;
パスワードを入力してください:*******
mysql> TUTORIALS を使用します。
データベースが変更されました
mysql> テーブル tcount_tbl を作成します
 -> (
 -> tutorial_author varchar(40) NOT NULL、
 -> チュートリアルカウント INT
 -> ) TYPE=InnoDB;
クエリは正常、影響を受けた行は 0 行 (0.05 秒)

他の GEMINI または BDB テーブル タイプも使用できますが、両方のタイプがサポートされているかどうかはインストールによって異なります。

プロジェクト設計には金銭の送金が含まれるため、一連の処理結果の正確性を保証するために MYSQL トランザクション処理が必要です。トランザクションを使用する場合、データの正確性を確保するために、ある程度の速度を犠牲にすることは避けられません。

InnoDBのみがトランザクションをサポート

トランザクション ACID 原子性、一貫性、独立性、永続性

1. トランザクションの原子性 トランザクションのグループは成功するか、取り消されます。

2. 不正なデータ(外部キー制約など)がある場合、トランザクションは取り消されます。

3. 分離トランザクションは独立して実行されます。
トランザクションの結果が他のトランザクションに影響を与える場合、他のトランザクションは取り消されます。
トランザクションを 100% 分離するには、速度を犠牲にする必要があります。

4. 信頼性: ソフトウェアまたはハードウェアがクラッシュすると、InnoDB データ テーブル ドライバーはログ ファイルを使用して再構築および変更を行います。
信頼性と高速性を同時に実現することはできません。innodb_flush_log_at_trx_commit オプションは、トランザクションがログに保存されるタイミングを決定します。

取引を開く

START TRANSACTION または BEGIN

トランザクションをコミットする(トランザクションを閉じる)

専念

トランザクションを放棄する(トランザクションを閉じる)

ロールバック

転換点

セーブポイント adqoo_1
セーブポイントへのロールバック adqoo_1

再エントリ ポイント adqoo_1 より前に発生したトランザクションはコミットされ、adqoo_1 より後に発生したトランザクションは無視されます。

取引の終了

自動コミットモードの設定
自動コミットを 0 に設定する
各 SQL ステートメントは、COMMIT または ROLLBACK によって区切られた、同じトランザクションの異なるコマンドです。切断後、COMMIT のないトランザクションはすべて破棄されます。

トランザクションロックモード

システムのデフォルト: トランザクションが終了するまで待つ必要はなく、結果を直接照会できますが、結果を変更または削除することはできません。
デメリット: クエリ結果が古くなっている可能性があります。
利点: トランザクションが終了するまで待つ必要がなく、結果を直接照会できます。

ロックモードを設定するには次のモードが必要です

1. SELECT ... LOCK IN SHARE MODE (共有ロック)
クエリされたデータは、現時点でのデータベースのデータです(コミットされた他のトランザクションの結果がここに反映されています)
SELECTはトランザクションが終了するまで実行を待つ必要があります

2. SELECT ... FOR UPDATE (排他ロック)
たとえば、SELECT * FROM tablename WHERE id<200
その後、ID が 200 未満のデータとクエリされたデータは、このトランザクションが終了するまで変更、削除、または SELECT ... LOCK IN SHARE MODE 操作を行うことができなくなります。共有ロックと排他ロックの違いは、他のクライアントによって発行された SELECT ... LOCK IN SHARE MODE コマンドをブロックするかどうかです。

3. 挿入 / 更新 / 削除
関連するすべてのデータがロックされ、排他ロックも追加されます

4. 挿入防止ロック<br /> たとえば、SELECT * FROM tablename WHERE id>200
すると、ID>200のレコードは挿入できません

5. デッドロック<br /> デッドロックを自動的に識別します。最初に実行されたプロセスが実行され、後のプロセスはエラー メッセージを受信して​​ ROLLBACK モードでロールバックします。
innodb_lock_wait_timeout = n 最大待機時間を設定します。デフォルトは 50 秒です。

トランザクション分離モード

[セッション|グローバル]トランザクション分離レベルの設定
コミットされていない読み取り | コミットされた読み取り | 繰り返し読み取り | シリアル化可能

1. SESSIONまたはGLOBALのないSETコマンドは、次のトランザクションに対してのみ有効です。

2. セッションを設定する
現在のセッションの分離モードを設定します

3. グローバル設定
すべての新しい MYSQL 接続の分離モードを設定します (現在の接続は含みません)
隔離モード
コミットされていない読み取り
SELECTを分離しない
他のトランザクションによる未完了の変更(COMMITではない)の結果も考慮されます。
コミットされた読み取り
他のトランザクションの COMMIT 変更を考慮すると、同じ SELECT ステートメントが同じトランザクション内で異なる結果を返す場合があります。
繰り返し読み取り (デフォルト)
他のトランザクションによる変更は考慮されません。他のトランザクションが COMMIT コマンドを使用して同じトランザクションをコミットしたかどうかに関係なく、同じ SELECT ステートメントは同じ結果を返します (トランザクションが変更を行わないと仮定)。
シリアル化可能
REPEATABLE READ と同様に、すべての SELECT に共有ロックが追加されます。

エラー処理

エラー情報に応じて対応する処理を実行する

MySQL トランザクション処理の例

MYSQLトランザクション処理には主に2つの方法があります

1. begin、rollback、commitを使用して実装する

  • beginトランザクションを開始する
  • ロールバックトランザクションのロールバック
  • トランザクションのコミット確認

2. MySQLの自動送信モードを変更するにはsetを直接使用します。

  • MySQL はデフォルトで自動的に送信されます。つまり、クエリを送信すると、直接実行されます。できる
  • set autocommit = 0 自動コミットを無効にする
  • set autocommit = 1 自動コミットを有効にする

トランザクション処理を実装します。

ただし、set autocommit = 0 を使用すると、コミットで確認するかロールバックで終了するまで、後続のすべての SQL ステートメントがトランザクションとして処理されることに注意してください。このトランザクションを終了すると、新しいトランザクションも開始されることに注意してください。最初の方法によると、現在のものだけがトランザクションとして扱われます。

MYSQL は INNODB および BDB タイプのデータ テーブルのトランザクション処理のみをサポートしており、他のタイプはサポートされていません。

mysql> テストを使用します。
 データベースが変更されました
 mysql> テーブル `dbtest`( を作成します。
 -> id int(4)
 -> ) TYPE=INNODB;
クエリは正常、影響を受けた行は 0 行、警告は 1 件 (0.05 秒)

mysql> dbtestから*を選択
 -> ;
空セット (0.01 秒)

mysql> 開始します。
クエリは正常、影響を受けた行は 0 行 (0.00 秒)

mysql> dbtest に値を挿入します(5);
クエリは正常、1 行が影響を受けました (0.00 秒)

mysql> dbtest値に挿入(6);
クエリは正常、1 行が影響を受けました (0.00 秒)

mysql> コミット;
クエリは正常、影響を受けた行は 0 行 (0.00 秒)

mysql> dbtest から * を選択します。
+------+
|id|
+------+
| 5 |
| 6 |
+------+
セット内の 2 行 (0.00 秒)

mysql> 開始します。
クエリは正常、影響を受けた行は 0 行 (0.00 秒)

mysql> dbtest値に挿入します(7);
クエリは正常、1 行が影響を受けました (0.00 秒)

mysql> ロールバック;
クエリは正常、影響を受けた行は 0 行 (0.00 秒)

mysql> dbtest から * を選択します。
+------+
|id|
+------+
| 5 |
| 6 |
+------+
セット内の 2 行 (0.00 秒)

MySQL トランザクション処理

PHP コードは、PHP 定義済みクラス mysqli の次のメソッドを通じてトランザクション処理を実装できます。

  • autocommit(boolean): このメソッドは、クエリ結果が自動的に送信されるかどうかを制限するために使用されます。このメソッドのパラメータが true の場合、自動的に送信されます。パラメータが false の場合、自動送信はオフになります。 MySQL データベースはデフォルトで自動コミットに設定されています。
  • rollback(): mysqli クラスのこのメソッドは、トランザクションをロールバックするために使用できます。
  • commit(): このメソッドはすべてのクエリをコミットするために使用できます。
<?php
include_once("conn.php");

$id = $_GET[id];
$conn->自動コミット(false);
if(!$conn->query("id='".$id."'") の tb_sco から削除)
{
 ロールバック
}
if(!$conn->query("id='".$id."'") の tb_stu から削除)
{
 ロールバック
}
 $conn->コミット();
 自動コミットを有効にする
 「OK」をエコーする
?>

<?php
require('connectDB.php'); //データベース接続を確立します mssql_query("BEGIN TRANSACTION DEPS02_DEL"); //トランザクションを開始します $delete_dep_sql="DELETE FROM TBLDEPARTMENT WHERE DEPTID='{$_GET[deptid]}'";
// $delete_dep_sql をエコーし​​ます。<br>";
mssql_query($delete_dep_sql); //データベースを操作する// var_dump($del_result);
$delete_result = mssql_query("IDとして@@ROWCOUNTを選択");
$delete_info = mssql_fetch_array($delete_result);
行を削除します。
// var_dump($delete_rows);
mssql_free_result($delete_result);
echo "<script language=javascript>";
if(true){ //コミットをロールバックするかどうかを判断 mssql_query("COMMIT TRANSACTION DEPS02_DEL"); //トランザクションをコミット echo "alert('delete success!');";
}それ以外{
mssql_query("ROLLBACK TRANSACTION DEPS02_DEL"); // トランザクションをロールバック echo "alert('delete faile!');";
}
echo "</script>";mssql_close();
?>

MySQL トランザクション処理は、実用的な問題に対処する上で広範かつ重要な用途があります。最も一般的な用途としては、銀行振込サービス、電子商取引の支払いサービスなどがあります。ただし、MySQL のトランザクション処理機能は MYSIAM ストレージ エンジンではサポートされていませんが、InnoDB ストレージ エンジンではサポートされていることに注意してください。ここで、MySQL トランザクション処理の理解を始めるためのガイドとして、コードをアップロードします。簡単な例ですが、アイデアが統合されており、非常に役立つと思います。

<?php
$conn = mysql_connect('localhost','root','yourpassword') または die(mysql_error());
mysql_select_db('トランザクション',$conn);
mysql_query('名前をutf8に設定');

//トランザクションを作成するmysql_query('START TRANSACTION') または die(mysql_error());
$sqlA="Aを更新し、アカウントをアカウント1に設定";
if(!mysql_query($sqlA)){
&nbsp;&nbsp;&nbsp; mysql_query('ROLLBACK') または exit(mysql_error());// 実行が失敗した場合は判断してロールバックします&nbsp; exit();
}
$sqlB="Bを更新し、アカウントをアカウント+1に設定します";
if(!mysql_query($sqlB)){
&nbsp;&nbsp;&nbsp; mysql_query('ROLLBACK') または exit(mysql_error());// 実行が失敗した場合は判断してロールバックします&nbsp; exit();
}
mysql_query('COMMIT')またはdie(mysql_error());//トランザクションを実行 mysql_close($conn);
?>

上記のコードは、銀行振込業務をシミュレートするためのトランザクションフローとして使用できます。表 A と表 B は、銀行に開設された 2 つの口座を表しています。口座 A から口座 B に 1 元を送金する場合、操作が失敗すると、送金は元の状態にロールバックされ、それ以上の操作は実行されません。逆に、操作が正常に実行された場合、アカウント B の利用可能残高は 1 元増加しますが、そうでない場合は、トランザクションは元の状態にロールバックされます。

この記事がお役に立てば幸いです。これで、MySQL トランザクション処理の使用方法とサンプル コードの紹介は終了です。皆様、引き続き当サイトにご注目いただければ幸いです。MySQLを学習したい方は、引き続き当サイトにご注目ください。

以下もご興味があるかもしれません:
  • Javaで実装されたMySQLトランザクション処理操作の例
  • PHP+MySQL の高同時ロックトランザクション処理問題の解決方法
  • Mysqlトランザクション処理の詳細な説明
  • NodeJs は MySQL モジュールを使用してトランザクション処理の例を実装します
  • PHP での MySQL トランザクション処理における PDO の使用例
  • PHPでMySQLトランザクション処理を実装する方法
  • MySQLのトランザクション処理とアプリケーションの簡単な分析
  • MySQLのトランザクション処理とテーブルロックの詳細な分析

<<:  PHPのmail()関数を使用してメールを送信する

>>:  Dockerリポジトリの一般的なコマンドの詳細な説明

推薦する

MySQL 全文インデックスガイド

全文インデックスには特別なクエリ構文が必要です。全文検索はインデックスの有無にかかわらず実行できます...

初心者向けBootstrap 3.0学習ノート

この学習ノートの最初の記事として、シリーズの他の記事と同様に、Bootstrap の紹介から始め、そ...

MySQL 最適化 Zabbix パーティション最適化

zabbix を利用する上での最大のボトルネックはデータベースです。zabbix のデータストレージ...

MySQLの行ロックとテーブルロックの意味と違いの詳細な説明

1. はじめに行ロックとテーブルロックの違いは面接で頻繁に出てくるはずです。MySQL のロックにつ...

CSS (カスケーディング スタイル シート) の一般的な用語の概要

CSS を使用する場合は、DOCTYPE (ドキュメント タイプ定義) を記述することを忘れないでく...

docker+jenkins+node.js の自動デプロイメント環境をゼロから構築する方法

このケースはCentOS 7システムに基づいていますDockerの使用経験がある人に適していますLi...

Windows Apache 環境で SSL 証明書を展開して、Web サイトを https 対応にする方法

SSL 証明書の使用についてはここでは説明しません。SSL 証明書を導入する必要がある友人は、すでに...

Vue 天気予報入門

この記事では、参考までに天気予報を実装するためのVueの具体的なコードを紹介します。具体的な内容は次...

Vueプロジェクトが完了した後にプロジェクトを最適化する方法の例

目次1. 開発モードとリリースモードに異なるパッケージエントリポイントを指定する2. 外部CDNリソ...

ウェブ標準学習リソースの素晴らしいコレクション

これらの仕様は、下位互換性のあるドキュメントを Web 上で公開し、できるだけ幅広いユーザーがアクセ...

node.js で EventEmitter をカスタマイズする方法

目次序文1. 何ですか2. Node.jsでEventEmitterを使用する方法3. 実施プロセス...

Vue 3 で Vue Router リンクを拡張する方法

序文<router-link> タグは、Vue アプリ内のさまざまなページ間を移動するた...

Windows プラットフォーム構成 5.7 バージョン + MySQL データベース サービス

ルートユーザーのパスワードを初期化するプロセスと、よくある2つの問題の解決策が含まれています。 1....

WindowsでcmdからDOSウィンドウに入り、MySQLデータベースにアクセスします。

1. win + R を押して cmd と入力し、DOS ウィンドウに入ります。 2. MySQL...

CSS で背景ぼかし効果を実装するサンプルコード

以下のような効果でしょうか?もしそうなら、ぜひ読み進めてください! コードデモンストレーション(上の...