ホームページ  >  記事  >  データベース  >  MySQL トランザクションについて

MySQL トランザクションについて

一个新手
一个新手オリジナル
2017-10-13 10:30:141298ブラウズ

1》トランザクションとは何を指しますか?个 業務はビジネス ロジックの処理単位と見なすことができます。この単位は実行されるか実行されません。
2 "ACID 原則:
(1) アトミック性
(2) 一貫性 ブロック、2000 高速の B アカウント、
-A- 500-"B
AアカウントとBアカウントの実行前と実行前の5000 fast
の合計、この状態のこの合計は一致している必要があります。性 (3) 隔離 (lsolation)
A アカウント 3000--「500-& gt; B アカウント 2500
更新 (1) 転送
SELECT SUN () A B Together
(4) スレイヤー (4) スレイヤー (4) スレイヤー(4) スレイヤー (4) 最高の耐久性
保証された永続性:
1 & gt; トランザクションが引き渡される前:
トランザクションを撤回したい場合は、データをディスクに書き込みますか?データがディスクからリコールされましたか?非常に遅い?痛いですか?何をするか? ; 2 & gt;
のログを完成させるには、ディスク上にもデータ ファイルとの違いはあります。
違い: トランザクション ログはシーケンシャル I/O を生成しますが、ディスク データ ファイルはランダム I/O です。トランザクション ログの各操作はディスク上の連続ストレージ ブロックにシーケンシャルに書き込まれますが、私たちのデータ ファイルはそうではありません。 。志 (1) ログ: シーケンシャル IO
(2) データ ファイル: ランダム IO
トランザクション ログにトランザクションを書き込み、しばらくすると、物事のバックグラウンドまたは関連するプロセスがトランザクション内のデータをデータに再実装します。このようにして、処理対象となるデータの耐久性が保証されます。

3》トランザクションのステータス。
(1) アクティブなトランザクションである
トランザクションは実行中である
(2) 部分的にコミットされたトランザクション

トランザクションは実行されるか実行されないかのどちらかですが、部分送信とは何ですか?

つまり、トランザクションは実行され、その一部はディスクに書き込まれ、残りの部分は実行中であり、最後の実行ステートメントは書き込み中です。これを部分送信と呼びます
(3)失敗したトランザクション
トランザクションは正常に送信されましたが、送信されませんでした 目的を達成するために失敗したトランザクション (4) 一時停止されたトランザクションは、送信されない、または途中で終了することを一時停止といいます。 事 (5) 提出されたトランザクション
保健局が提出したトランザクションは、これら 5 つの州のいずれかに該当する必要があり、一度提出されたトランザクションは取り消すことができません。

4》トランザクションの同時実行性とスケジューリング
トランザクションの同時実行性:
1>スループットとリソース使用率の向上
2>待ち時間の削減
mine in me in in in 、トランザクションを分離する必要があります、分離したらどうなりますか?これは、トランザクション スケジューリングに依存します。一般に、トランザクション スケジューリングを完了するには、データベース システム自体が非常に複雑です。完了すると、2 つの一般的なスケジュール戦略があります:

utersefuse&1>一般的に、2つのトランザクションが互いにスケジュールされている場合、別のトランザクションの状態が同期しません復元可能なスケジューリングではローリング時に影響を受けるため、ロールバック時の影響を回避するために、いわゆるカスケード フリー スケジューリングを実装することもできます。


5》トランザクションの分離
トランザクションには複数の操作が含まれる可能性があり、トランザクション スケジューリングの存在は、これらの交差実行が発生しないように、注文をより適切にスケジュールするためのものです。トランザクション間の影響をさらに軽減するために、トランザクションには 4 つの分離レベルがあります。どの4つですか? ; 1 & gt; 分離レベルで unprooping Read UNCOMMITTED
を読み取ります。この分離レベルは、他のレベルの読み取りよりもそれほど優れていないため、実際のアプリケーションではほとんど使用されません。データはダーティ リード (ダーティ リード) とも呼ばれます
2> Read commit
ほとんどのデータベースのデフォルトの分離レベル (ただし、Mysql のデフォルト レベルはこれではありません)。これは分離の単純さを満たします。 定義: トランザクションは変更のみを確認できます。コミットされたトランザクションによって作成されます。 3>repeatable read 反復可能読み取り

これは Mysql のデフォルトのトランザクション分離レベルであり、同じトランザクションの複数のインスタンスが同時にデータを読み取ることを保証しますが、理論的にはこれにより、別の問題へ: ファントム読み取り (ファントム読み取り) 簡単に言えば、ファントム読み取りとは、ユーザーが特定の範囲のデータ行を読み取るときに、その範囲に別のトランザクションが挿入され、ユーザーがそのデータ行を読み取ることを意味します。この範囲では、新しい「ファントム行」が見つかります。Innodb および Falcon エンジンは、マルチバージョン同時実行制御 (MVCC) メカニズムを通じてこの問題を解決します。 ️ Serializable

これは、トランザクションの順序付けを強制することでファントム読み取りの問題を解決します。簡単に言えば、このレベルでは共有ロックがインストールされる可能性があります。一般に、同時実行制御が分離レベルを達成したい場合、それは同時実行制御に基づいて実装する必要があり、同時実行制御のリアルタイムはいくつかのテクノロジーに依存します。
(1). ロック。読み取り、書き込みロック、排他的ロック、共有ロック。
(2)。マルチバージョンおよびスナップショットの分離を記録する必要があります。 追加の拡張機能。 :
。さらに、デッドロックと呼ばれる別の種類のロックもあります

6》トランザクションの開始とロールバック

一般的に、トランザクションを開始する操作は次のとおりです。
1>トランザクションの開始

3>トランザクションのコミット



1>取引を開始します
データの復元を開始しますか?トランザクションのロールバック。推測しました。 C ロールバック;
4 & gt; 確認を表示、4 が返されましたか?
学生から * を選択します。 ; 1 & gt; トランザクションを開始します
2 & gt; Student テーブルの 1 つを削除します
3 & gt; C ロールバック
;データは再度復元できますか?
学生から * を選択すると、最初の 80 個の項目が間違って実行されていることがわかりました。 セーブポイントの役割が出てきます。例: 10 回の操作ごとに保存します:
2 & gt; Student テーブルの 1 つで「Cuihua」の情報を削除します
Student WHERE NAME = 'CUIHUA' から削除します

トランザクション ポイントを保存します

Savepoint yya
3 & gt; Student テーブルの 1 つで「Simon Blood」の情報を削除します
Student Where name = 'Ximenchuiniu' から削除します
Savepoint yyb
4 & gt; Er" with one Student table " tyb & 5 & gt; さて、回復を開始します
西門 Chuixue を復元したい場合は、 yya にロールバックします 皆さん、考えてみましょう。セーブポイントって何ですか?
6>復元が成功したか確認します
6>復元が成功したか確認します生徒から * を選択します。自動 6.3 トランザクションの自動送信

1 & gt; MySQL トランザクションを自動的に送信
select @@ AutoCommit; select @@ AutoCommit; +------------- +
セット内の 1 行 (0.00 秒)

2 & gt; mysql 自動送信を変更する
set authorocom mit = 0;

3 & gt; 状態名 = 'ximenchuniu' から削除
ロールバック;トランザクションを明示的に開始しなかったのですか?トランザクションは DML ステートメントのロールバックをサポートします。DDL は非表示のテスト コミットであるため、残念ながらサポートされていません。

読み取りがコミットされていないことを確認します:
分離レベルを問い合わせます select @@tx_isolation;
1.select @@tx_iso lation;
2.set tx_isolation='read_uncommittd ';

ウィンドウ 1 の操作:
1 .start トランザクションを開始します
2.update Student set age=' 70' where d_id=' 1010 '; 口 ウィンドウ 2 の操作

1. クロス トランザクションを開始します

2. Student から * を選択します。 1 ウィンドウが 70 に変更され、ウィンドウ トランザクションが送信されないことを確認します。 ダーティ リーディング 验 検証読み取りと送信
1 つの MySQL、2 つのウィンドウを開き、2 つのパーティがトランザクション ウィンドウ 1 とウィンドウ 2 をクロススタートします。 共通の操作:
1. @@ tx_isolation を選択します。
2. tx_isolation = 'read_committd' を設定します。
: ウィンドウ 1 の操作: 口 1. トランザクションを開始します。
2. Student Set Age = '70 'where d_id =' 1010 を更新します。 ';
3.コミット; 送信されたデータのみを表示します

ウィンドウ 2 の操作
1. トランザクションを開始します。
2. 1 のウィンドウで更新された学生データから * を選択します。更新されたデータは、ダーティ リーディングを避けるために、ウィンドウ A で 3 つの送信ステップを実行した後にのみ表示されます。

検証は読み取り可能です 个 1 つの MySQL、2 つのウィンドウを開いて、両方の側でトランザクションを開始します

ウィンドウ 1 とウィンドウ 2 の共通操作: 1.select @@tx_isolation;
- 2.set tx_isolation= 'repeatable-read ';

ウィンドウ 1 操作
1.トランザクションを開始します; クロストランザクションを開始します 2. 学生セット age='10' を更新します 3. クロストランザクションを開始します2 .select * from Student; まだ 1 ウィンドウで更新されたデータを確認します。 口 3.Select * From Student で更新されたデータが表示されます
4.Commit 2 ウィンドウが表示されます。
1 つの MySQL を開き、2 つのウィンドウを開き、2 つの当事者がトランザクションを実行します。
ウィンドウ 1 とウィンドウ 2 の共通操作:
1.@@ tx_isola を選択し、トランザクションを開始します。 2. 学生の設定年齢を更新します。 '60' (num='10' の場合) は実行できません。ウィンドウ 2 が操作を送信した後にのみ実行できます。
ウィンドウ 2 の操作。 1.Start Transaction; クロストランザクションを開始します。
2.Commit; が送信され、1 のウィンドウの更新が正常に実行されます。これは連載可能ですよ!个 理由: 事 2 つのトランザクションは同じデータを同時に変更するために実行され、一方の当事者が最初にそれを送信する必要があります。そうしないと、読み取りと書き込みが相互にブロックされます。

以上がMySQL トランザクションについての詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。