目次
マルチテーブルクエリの内容は終わりましたので、次に学習するのは新しい内容であるトランザクションで、いくつかのポイントに分けて学習していきます。
- 導入
- トランザクション操作
- トランザクションACIDの4大特徴
- 同時トランザクションの問題
- 分離レベル
- まとめ
まず、トランザクションについて簡単かつ一般的に理解しましょう。
導入
トランザクションは一連の操作であり、分割できない作業単位です。トランザクションは、システム全体に対して操作リクエストを送信または取り消します。つまり、これらの操作は同時に成功するか、同時に失敗します。
たとえば、次の 3 つの操作 (張三が李斯に 1,000 元を送金):
1. Zhang San の口座残高を確認します。
2. Zhang San の口座残高 -1000;
3. John Doe の口座残高は +1000 です。
通常の状況下で、
操作 1 と 2 を実行しました。2 から 3 のプロセス中に例外がスローされた場合、Li Si の残高は +1000 の操作を完了していませんが、Zhang San のアカウント残高はまだ 1000 減少しているため、Zhang San になります。無駄に1,000元を失いましたが、これは明らかに不合理です。
したがって、トランザクションを使用してこれらの操作を操作および結合する必要があります。
トランザクション開始後、操作1、2を実行します。2から3の処理中に例外がスローされた場合、トランザクションはロールバックされ、操作1に戻ります。
すべての操作が完了するまで、トランザクションはコミットされません。
デフォルトでは、MySQL トランザクションは自動的にコミットされます。つまり、DML ステートメントが実行されると、MySQL は即座に暗黙的にトランザクションをコミットします。
トランザクション操作
トランザクション送信方法の表示/設定
SELECT @@autocommit; -- 查看事务提交方式
SET @@autocommit = 0; -- 设置事务提交方式
-- 0代表手动提交事务,1代表自动提交事务
トランザクションの送信方法を手動送信に変更すると、トランザクションを送信するために SQL ステートメントが実行されるたびに COMMIT が要求されます。そうでないと、データは一時的に変更されるだけで、データはデータベースに送信されません。
オープントランザクション
START TRANSACTION 或 BEGIN;
実行されたステートメントは、上記のグローバル設定とは異なり、オンになった後にのみ手動で送信されます。
トランザクションをコミットする
COMMIT;
すべての操作が正しい場合、トランザクションを送信し、データをデータベースに送信できます。
トランザクションのロールバック
ROLLBACK;
操作が異常な場合、操作を取り消してやり直す必要があります。これをロールバック トランザクションと呼びます。
4大特徴 ACID
面接の質問に関する 4 つの主な特徴
原子性_ _
- トランザクションは、全体が成功するか全体が失敗する、分割できない最小の操作単位です。
トランザクションが実行されると、同じバッチで一連の SQL ステートメントが実行されます。1 つの SQL ステートメントでエラーが発生した場合、バッチ内のすべての SQL ステートメントがキャンセルされます。
一貫性_ _
- トランザクションが完了すると、すべてのデータが一貫した状態になる必要があります。
たとえば、銀行振込は 2 つのアクションに分類できます。1 つは口座 A からの資金 X の引き落とし、もう 1 つは口座 B への資金 X の追加です。このプロセス中にエラーが発生した場合は、操作全体を初期状態にロールバックする必要があります。A と B の合計口座残高が初期状態と一致していることを確認します。
孤立_ _
- データベース システムが提供する分離メカニズムにより、トランザクションは外部の同時操作の影響を受けない独立した環境で実行されます。
たとえば、あるトランザクションが特定のデータ項目を変更しており、この時点で別のトランザクションもそのデータ項目を変更しようとしていますが、分離が存在するため、2 番目のトランザクションは最初のトランザクションが変更を完了するまで待機してから変更が行われます。修正。
耐久性_ _
- トランザクションがコミットまたはロールバックされると、データベース内のデータに対する変更は永続的になります。
トランザクションがコミットされると、データベースへの変更は永続的になる必要があり (データ送信はハード ディスクに保存されます)、その後の他の操作や失敗がこのトランザクションの変更に影響を与えることはありません。
同時トランザクションの問題
ダーティリード
あるトランザクションは、別のトランザクションがまだコミットしていないデータを読み取ります。
反復不可能な読み取り
トランザクションは同じレコードを連続して読み取りますが、2 回読み取られるデータは異なります。これを非反復読み取りと呼びます。
幻の読書
トランザクションが条件に従ってデータをクエリすると、対応するデータ行は存在しませんが、データを挿入すると、あたかも「ファントム」が現れたかのように、このデータ行がすでに存在していることがわかります。
トランザクションの同時実行性の問題を解決するには、さまざまな同時実行性の問題に応じて異なる分離レベルを設定する必要があります。
トランザクション分離レベル
分離レベル | ダーティリード | 反復不可能な読み取り | 幻の読書 |
---|---|---|---|
コミットされていない読み取り (Oracle のデフォルト) | 現れる | 現れる | 現れる |
読み取りがコミットされました | 表示されません | 現れる | 現れる |
反復読み取り (MySQL のデフォルト) | 表示されません | 表示されません | 現れる |
シリアル化可能 | 表示されません | 表示されません | 表示されません |
トランザクション分離レベルの表示
SELECT @@TRANSACTION_ISOLATION;
トランザクション分離レベルを設定する
SET [SESSION GLOBAL /* 设置当前窗口的事务隔离级别 */ ]
TRANSATION ISOLATION LEVEL [READ UNCOMMITTED | ......];
注: トランザクション分離レベルが高くなるほど、データの安全性は高まりますが、パフォーマンスは低下します。
したがって、トランザクションの同時実行性の問題とパフォーマンスのバランスを比較検討し、適切な分離レベルを選択する必要があります。
まとめ
1. 取引の概要
トランザクションは、すべてが正常に実行されるか、すべてが失敗する一連の操作です。
2. トランザクション操作
START TRANSACTION; -- 开启事务
COMMIT / ROLLBACK; -- 提交/回滚事务
3. 不倫の4つの特徴
原子性、一貫性、分離性、耐久性
4. 同時トランザクションの問題
ダーティリード、ノンリピートリード、ファントムリード
5. トランザクション分離レベル
READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ、SERIALIZABLE
終わり
学習元: ダークホース プログラマー - MySQL データ コース