MySQL でのトランザクションの使用方法

MySQL でのトランザクションの使用方法

基礎

トランザクションは、SQL ステートメントのグループに対するアトミック操作です。つまり、グループ内の SQL ステートメントの 1 つでエラーが発生した場合、同じグループ内の他の SQL ステートメントは実行されません。

テストとして使用できます。一連の SQL ステートメントを実行した後、結果が正しいかどうかを確認できます。正しい場合は、送信を選択できます。正しくない場合は、ロールバックして元の状態に戻すことができます。

MySQL では、すべての操作はデフォルトで自動的にコミットされ、トランザクションが開始されると手動でコミットされます。

基本的な使い方

別途開く

単一のオープンとは、SQL ステートメントのグループに対してトランザクションを開くことを意味します。

テーブルユーザーの作成(
  id INT UNSIGNED AUTO_INCREMENT 主キー、
  名前 CHAR(12) NOT NULL,
  バランス INT UNSIGNED 
); -- ユーザーテーブルを作成する INSERT INTO user(name,balance) VALUES
  (「ユンヤ」1000年)
  ("Ken",500); -- データを挿入します start transaction; -- トランザクションを開始します。すべての追加、削除、および変更操作は手動で送信する必要があります UPDATE user SET balance = 500 WHERE name = "Yunya"; -- Yunya は Ken に 500 を送金します
  UPDATE user SET balance = 1000 WHERE name = "Ken";
  SELECT * FROM user; -- エラーがあるかどうかを確認します COMMIT; -- トランザクションをコミットします: 上記の2つのUPDATEを手動でコミットします
  -- ROLLBACK; -- トランザクションのロールバック: 転送量が正しくない場合は、ロールバック BEGIN を使用します -- トランザクションを閉じると、すべての追加、削除、変更操作が自動的にコミットされます

グローバルに有効化

すべての SQL ステートメントがトランザクション操作を使用する場合は、SET AUTOCOMMIT=0 で自動送信をオフにしてトランザクション メカニズムを有効にし、すべてのステートメントがトランザクション タイプになるようにすることができます。

-- 自動コミットをオフにする SET AUTOCOMMIT = 0;

ユーザー(名前、残高)に値を挿入
	(「ジャック」、8000)
	
専念;

-- 自動コミットを有効にする SET AUTOCOMMIT = 1;

トランザクション分離

同時実行の問題

同時実行性の高いアクセスで複数のトランザクションの分離の問題が発生すると、次のようなことが起こる可能性があります。

ダーティ リード: トランザクション A がトランザクション B によって更新されたデータを読み取り、その後 B が操作をロールバックします。この場合、A によって読み取られたデータはダーティ データです。非反復読み取り: トランザクション A が同じデータを複数回読み取ります。トランザクション A がデータを複数回読み取るプロセス中に、トランザクション B がデータを更新してコミットするため、トランザクション A が同じデータを複数回読み取ると、結果が不一致になります。
ファントム リード: システム管理者 A は、データベース内のすべての学生の成績を特定のスコアから ABCDE の成績に変更しましたが、システム管理者 B は、このとき特定のスコアのレコードを挿入しました。システム管理者 A が変更を終えると、まるで錯覚が起こったかのように、変更されていないレコードがまだ残っていることに気付きます。これをファントム リードと呼びます。
非反復読み取りとファントム読み取りは混同されやすいです。非反復読み取りは変更に重点を置いていますが、ファントム読み取りは追加または削除に重点を置いています。非反復読み取りの問題を解決するには、条件を満たす行のみをロックする必要があります。ファントム読み取りの問題を解決するには、テーブルをロックする必要があります。

分離レベル

システムのデフォルトの分離レベルはレベル 3 であり、ファントム リードが発生する可能性があります。

分離レベル中国語の意味ダーティリード繰り返し不可能な読み取りファントムリード例示する
コミットされていない読み取りコミットされていない読み取りはいはいはい最も低いトランザクション分離レベル。トランザクションがコミットされる前に、そのトランザクションによる変更は他のトランザクションで確認できます。
コミットされた読み取り繰り返し不可能な読み取りいいえはいはいトランザクションがコミットされた後にのみ、別のトランザクションによって読み取ることができるようにします。別のトランザクションは、このトランザクションのコミットされていないデータを読み取ることができません。
繰り返し読み取り繰り返し読み取りいいえいいえはい同じ範囲のデータを複数回読み取ると、他のトランザクションによってデータが更新または変更された場合でも、最初のクエリのスナップショットが返されます。トランザクション実行中に見られるデータは一貫していなければならない
シリアル化可能シリアル化いいえいいえいいえトランザクションは 100% 分離されているため、ダーティ リード、反復不可能なリード、ファントム リードなどを回避できます。最も高価だが最も信頼性の高いトランザクション分離レベル

クエリ設定

クエリ分離レベル

@@tx_isolation を選択します。

分離レベルの設定

set session トランザクション分離レベル read uncommitted; -- set session は現在のセッションに対してのみ有効で、set global はグローバルに有効です。

上記は、MySQL がトランザクションを使用する方法の詳細です。MySQL トランザクションの詳細については、123WORDPRESS.COM の他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • PHP+MySQL 分散トランザクションとソリューションに関する深い理解
  • MySQL のロックとトランザクションの簡単な分析
  • MySQLトランザクションの特徴と分離レベルについてお話ししましょう
  • MySQL は ACID トランザクションをどのように実装しますか?
  • MySQL が大規模トランザクションを避けるべき理由とその解決方法
  • MySQL トランザクション分離レベルの原則例分析
  • MySQL トランザクション分離レベルの表示と変更の例
  • MySQLのトランザクション特性とレベル原則の分析

<<:  Vueはechartを使用してラベルと色をカスタマイズします

>>:  Ubuntuはポート22を開きます

推薦する

Hadoop 2.Xの新機能、ごみ箱機能の説明

ごみ箱機能をオンにすると、削除されたファイルの元のデータをタイムアウトなしで復元できるため、誤って削...

あなたを救うために、私のテーブルは何を使えばいいでしょうか (Haiyu Blog)

テーブルはかつて、Web ページの開発、つまりレイアウトにおいて非常に重要な役割を果たしていました。...

テキスト ファイルの並べ替えに役立つ Awk コマンドラインまたはスクリプト (推奨)

Awk は、ソートを含む他の一般的なユーティリティによって実行できるいくつかのタスクを実行できる強...

Docker は 2003 年の問題を解決するために MySQL リモート接続を導入しました

MySQLへの接続ここでは、リモート接続に navicat を使用します。MySQL に接続する前に...

フレックスレイアウトによるシームレスなスクロールのサンプルコード

この記事では、シームレスなスクロールを実現するためのフレックスレイアウトのサンプルコードを主に紹介し...

iostat を使用して Linux ハードディスクの IO パフォーマンスを表示する方法

TOP 観察: IO 待機に占められる CPU 時間の割合。30% を超えると、IO の負荷が高くな...

VUEはFlappy Birdゲームのサンプルコードを実装します

Flappy Bird は、誰もがアプリでプレイしたことがある非常にシンプルな小さなゲームです。ここ...

Dockerを使用してElasticsearchクラスターを素早くデプロイする方法

この記事では、 Dockerコンテナ ( docker-composeを使用してオーケストレーション...

MySQLにおける(JOIN/ORDER BY)文のクエリ処理と最適化方法

EXPLAIN ステートメントは、MySQL クエリ ステートメント プロセスと EXPLAIN ス...

HTML5+CSS3 ヘッダー作成例と更新

前回、私たちは 2 つのヘッダー レイアウト (フレックスボックス 1 つとフロート 1 つ) を考...

Docker.v19 で Docker Compose オーケストレーション ツールをインストールして構成する方法

1. Compose の紹介Compose は、マルチコンテナ Docker アプリケーションを定義...

MIME TYPEとは?MIME-Typesタイプコレクション

MIME タイプとは何ですか? 1. まず、ブラウザがコンテンツを処理する方法を理解する必要がありま...

Reactのようなフレームワークをゼロから作成する

最近、インターネットで「Build your own React」という記事を見ました。著者は、シン...

1行のコードでLinuxのプロセスを隠す方法を学ぶ

友人たちはいつも、Linux のプロセスを隠す方法を私に尋ねます。私は、どの程度隠したいのか、カーネ...

ページのスクロールバーを無効にするには、overflow: hiddenを使用します。

コードをコピーコードは次のとおりです。 html {オーバーフロー: 非表示; }体{オーバーフロー...