MySQL トランザクション サポートは、MySQL サーバー自体にバインドされているのではなく、ストレージ エンジンに関連しています。 1.MyISAM: トランザクションをサポートしておらず、パフォーマンスを向上させるために読み取り専用プログラムに使用されます。 トランザクションとは、単一の作業単位であるかのように実行される、連続した一連のデータベース操作です。つまり、グループ内の個々の操作がすべて成功しない限り、トランザクションは完了しません。トランザクション内のいずれかの操作が失敗すると、トランザクション全体が失敗します。 取引の特徴: トランザクションには次の 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. 分離トランザクションは独立して実行されます。 4. 信頼性: ソフトウェアまたはハードウェアがクラッシュすると、InnoDB データ テーブル ドライバーはログ ファイルを使用して再構築および変更を行います。 取引を開く START TRANSACTION または BEGIN トランザクションをコミットする(トランザクションを閉じる) 専念 トランザクションを放棄する(トランザクションを閉じる) ロールバック 転換点 セーブポイント adqoo_1 セーブポイントへのロールバック adqoo_1 再エントリ ポイント adqoo_1 より前に発生したトランザクションはコミットされ、adqoo_1 より後に発生したトランザクションは無視されます。 取引の終了 自動コミットモードの設定 トランザクションロックモード システムのデフォルト: トランザクションが終了するまで待つ必要はなく、結果を直接照会できますが、結果を変更または削除することはできません。 ロックモードを設定するには次のモードが必要です 1. SELECT ... LOCK IN SHARE MODE (共有ロック) 2. SELECT ... FOR UPDATE (排他ロック) 3. 挿入 / 更新 / 削除 4. 挿入防止ロック<br /> たとえば、SELECT * FROM tablename WHERE id>200 5. デッドロック<br /> デッドロックを自動的に識別します。最初に実行されたプロセスが実行され、後のプロセスはエラー メッセージを受信して ROLLBACK モードでロールバックします。 トランザクション分離モード [セッション|グローバル]トランザクション分離レベルの設定 1. SESSIONまたはGLOBALのないSETコマンドは、次のトランザクションに対してのみ有効です。 2. セッションを設定する 3. グローバル設定 エラー処理 エラー情報に応じて対応する処理を実行する MySQL トランザクション処理の例 MYSQLトランザクション処理には主に2つの方法があります 1. begin、rollback、commitを使用して実装する
2. MySQLの自動送信モードを変更するにはsetを直接使用します。
トランザクション処理を実装します。 ただし、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 の次のメソッドを通じてトランザクション処理を実装できます。
<?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)){ mysql_query('ROLLBACK') または exit(mysql_error());// 実行が失敗した場合は判断してロールバックします exit(); } $sqlB="Bを更新し、アカウントをアカウント+1に設定します"; if(!mysql_query($sqlB)){ mysql_query('ROLLBACK') または exit(mysql_error());// 実行が失敗した場合は判断してロールバックします exit(); } mysql_query('COMMIT')またはdie(mysql_error());//トランザクションを実行 mysql_close($conn); ?> 上記のコードは、銀行振込業務をシミュレートするためのトランザクションフローとして使用できます。表 A と表 B は、銀行に開設された 2 つの口座を表しています。口座 A から口座 B に 1 元を送金する場合、操作が失敗すると、送金は元の状態にロールバックされ、それ以上の操作は実行されません。逆に、操作が正常に実行された場合、アカウント B の利用可能残高は 1 元増加しますが、そうでない場合は、トランザクションは元の状態にロールバックされます。 この記事がお役に立てば幸いです。これで、MySQL トランザクション処理の使用方法とサンプル コードの紹介は終了です。皆様、引き続き当サイトにご注目いただければ幸いです。MySQLを学習したい方は、引き続き当サイトにご注目ください。 以下もご興味があるかもしれません:
|
>>: Dockerリポジトリの一般的なコマンドの詳細な説明
問題の原因:スレーブサーバーがクローンマスターサーバーである場合、server-uuidの値は同じで...
序文データベースでは、一部のデータ テーブルとデータは latin1 であり、一部のデータ テーブル...
Q: xml と html の違いがわかりません。違いは何ですか? A: XMLと HTML の違い...
目次1. ノードをインストールする2. Commander.jsをインストールする3. JavaSc...
コードをコピーコードは次のとおりです。 <前> <div> <sele...
非直交マージンマージンを使用するとマージが発生します次のプロパティはマージンの結合を防止します。国境...
電話Amap API を呼び出す方法は? Amap が https://lbs.amap.com/a...
JS には、文字列をインターセプトするための 3 つのメソッド、 slice() 、 substri...
今日ふと、HTML でチェックボックスのスタイルを変更できる範囲が限られていることと、チェックボック...
導入GitLab CE または Community Edition は、主に Git リポジトリのホ...
WordPress のマルチサイト機能を使用すると、1 つの WordPress プログラムをインス...
0x00 はじめにWordPress は、世界で最も人気のある CMS システムです。PHP と M...
calc は数値を計算するために使用される CSS 関数です。長さ、角度、時間などを計算できます。 ...
要件: ページに画像を表示する必要がありますが、さまざまな理由により、画像はサーバー 2 にあります...
<br />解決手順は次のとおりです。スタート -> 実行 -> reged...