[MySQLラーニングチャプター]-トランザクション
記事のディレクトリ
トランザクションを導入する
銀行振込の過程で、まずお金を減らすためのSQLステートメントを実行し、次にお金を追加するためのSQLステートメントを実行する必要があると仮定しますが、途中で事故が発生した場合、誰かが損失を被ります
UPDATE bank SET money=money-200 WHERE id='119';
#中间出现意外,钱减了,但是另一方没有加上
UPDATE bank SET money=money+200 WHERE id='911';
このとき、問題を解決するためのトランザクションを導入して、2つの部分が全体であることを確認する必要があります。
トランザクションとは何ですか?
複数の操作セット(すべて成功またはすべて失敗)
起点(start transaction):开启事务
(中间失败:回滚 到 起点)rollback;
终点(commit):提交 当前事务已经结束
START TRANSACTION ;
UPDATE bank SET money=money-200 WHERE id='119';
UPDATE bank SET money=money+200 WHERE id='911';
COMMIT;
つまり、コミットが実行されると、データベース内のデータが実際に変更されます。
トランザクションの4つの特徴:
-
Atomicity(automic):同じトランザクション内の複数の操作グループは分離できず、全体である必要があります
-
一貫性:トランザクション操作前の合計金額は、トランザクション操作後の合計金額と一致しています
-
分離(ISOLATION):複数のトランザクションが互いに干渉しない
-
永続性(永続性):送信後にデータがデータベースまたはテーブルに入力されると、データは永久に存在します
4つの分離レベル
4つの分離レベル(低から高まで):コミットされていない読み取り、コミットされた読み取り、リピートベール、シリアル化可能
分離レベルが高いほど、パフォーマンスが低下します
mysqlソフトウェアの分離レベルを表示する
SELECT @@transaction_isolation;#(8.0以后)
select @@tx_isolation;#(8.0以前)
mysqlソフトウェアのデフォルトの分離レベルを変更します。SETGLOBALTRANSACTIONISOLATIONLEVEL分離レベル。
SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED;
分離レベルが異なると、問題も異なります。
ダーティリード:
MySQLトランザクション分離レベルがコミットされていない読み取り(コミットされていない読み取り)になると、ダーティ読み取りがトリガーされます。
1つのトランザクションが別のコミットされていないトランザクションを読み取ることができます。トランザクションAが追加、削除、変更、およびチェックしたが、コミットされていない場合、トランザクションBはそれを読み取ることができます。
ダーティリードを解決します。レベルをコミットされたリードに変更できる場合、繰り返し不可能なリードが発生します。
繰り返し不可
MySQLトランザクション分離レベルが読み取りコミットされると(読み取り専用がコミットされると)、繰り返し不可能な読み取りがトリガーされます。
同じトランザクションで、複数の読み取りの結果に一貫性がありません。統計財務諸表でトランザクションを開始すると、別のトランザクションがテーブルの財務データを変更します。トランザクションが送信された後、統計トランザクションの統計値はそれぞれ異なります。時間。
繰り返し不可能な読み取りを解決する方法:レベルを繰り返し可能な読み取りに変更します
仮想読書(ファントム読書)
レベルが再現可能である場合、ファントム読み取り(ファントム読み取り)が発生します
繰り返し不可能な読み取りはデータの変更によるものであり、誤った読み取りはデータ項目の数の増加によるものであり、統計値に影響を与えます。