事務
トランザクションは完全なデータベース操作です。この操作には複数の SQL の実行が含まれる場合があります。これらの複数の SQL の実行は全体です。すべてが正常に実行されるか、すべてが失敗するかのどちらかです。
例: 送金操作: 口座 A から口座 B に送金します。口座 A が +100 の場合、口座 B は -100 でなければなりません。
オンライン注文の支払い: 販売者に注文し、プラットフォームで支払います。
MySQL では innodb エンジンのみがデータベース トランザクションをサポートします
トランザクションは、挿入、更新、および削除ステートメントを管理するために使用されます。
リレーショナル データ トランザクションの 4 つの主な特徴
一般に、トランザクションは 4 つの条件 (ACID) を満たす必要があります。アトミック性 (不可分性とも呼ばれます)、一貫性 (Consistency)、分離 (独立性とも呼ばれる分離)、および耐久性 (Durability) です。
原子性: トランザクション中の複数の操作はすべて成功するか失敗します。
耐久性: トランザクションがコミットされると、データベース サービスに問題が発生した場合でもデータを変更することはできません。
分離: データベースでは複数のトランザクションに同時にアクセスできますが、この場合、トランザクション間の操作を分離する必要があります。
隔離は 4 つのレベルに分類できます。
コミットされていない読み取りの問題: ダーティ リード
ダーティ リードの問題を解決するためにコミットされた読み取り: 非反復読み取り
反復可能な読み取りは、反復不可能な読み取りの問題、つまりファントム読み取りの問題を解決します。
すべての問題を解決するための直列化はロックに似ており、効率が低い
一貫性: データベースの整合性は、トランザクションの開始前と終了後に損なわれません。
例: 銀行口座の残高に対して複数の方法で複数の同時操作を実行すると、最終的な残高は期待どおりの結果になるはずであり、エラーは発生しません。
-- 设置MySQL事务的提交方式为手动提交
SET GLOBAL autocommit=0;
-- 查看事务提交模式
SHOW GLOBAL VARIABLES LIKE 'autocommit';
BEGIN;
INSERT INTO test(NAME)VALUES("aaaaa");
ROLLBACK;
SELECT * FROM test;
BEGIN;
INSERT INTO test(NAME)VALUES("aaaaa");
SELECT * FROM test;
COMMIT;
SELECT * FROM test;
1. ダーティ データの読み取り: ジャンク データが読み取られ、トランザクション A はトランザクション B のコミットされていないデータを読み取ります。
2. 非反復読み取り A トランザクションが開始された後、データが 2 回読み取られ、2 つのデータは異なっていました (期待される効果は、同じトランザクションで A によって読み取られたデータが同じであることです)。
3. ファントム読み取り:トランザクション A 開始後に 2 回読み取られるデータ量が不一致です。
トランザクション分離レベル
コミットされていない読み取り: A は B のコミットされていないデータを読み取ることができます 問題: ダーティ リードが発生し、ほとんど使用されなくなります
コミットされた読み取り: A は B のコミットされていないデータを読み取ることはできませんが、B の送信されたデータのみを読み取ることができます。これにより、ダーティ リードの問題が解決されますが、反復不可能な読み取りの問題も発生します。
例: ダーティ リード問題を解決する
例: 反復不可能な読み取りの問題が発生する
反復読み取り: トランザクション A の開始後、初めて特定のデータを読み取り、次にそのデータで、同じデータを 2 回目にクエリすると、元のデータと一貫性があり、反復読み取りによって不一致の問題が解決されます。 -繰り返し読める読書。
トランザクションを送信した後、再度クエリを実行して最新のデータを取得します。
例: mysql8.0 の対応する Innodb エンジンではファントム読み取りは発生しません。
シリアル化: すべての問題を解決し、一度に 1 つのトランザクションで値を操作できるようにするのが、最も安全で非効率的です。
MVCC
MVCC (マルチバージョン同時制御)
mysql の読み取り-書き込みおよび書き込み-読み取り操作を改善するために、書き込み-書き込みの 2 つの操作を同時に実行できます。Mysql は行レベルのロックをサポートしています。同じデータ行が操作される場合、確実にロックされます。ありえない。
テーブル内のレコードが操作されるたびに、トランザクションの ID 番号を記録するログ (undolog) が保存されます。
複数のトランザクション操作がある場合、トランザクション ID に基づいて操作のバージョン レコードが検索されます。
分離レベルが異なると、データの読み取り時にバージョン チェーンに基づいて ReadView (一時読み取りビュー) バージョン チェーン スナップショットが生成されます。
READ COMMITTED : データが読み取られる前に毎回 ReadView が生成されるため、繰り返し読み取りができなくなります。データが変更されると、バージョン チェーンも変更されます。ReadView 内のデータは読み取られるたびに変更されるため、 -繰り返し読める読書。
REPEATABLE READ : データが初めて読み取られたときに ReadView が生成されます。その後、データが変更され、バージョン チェーンが変更されます。問題ありません。初めてデータを読み取ったときに写真が撮影されました。
ロック機構
mysql のロックは主に書き込み操作に使用されます
, MySQL は行ロック、ギャップ ロック、テーブル ロックをサポートしています。
行ロック: トランザクションが行レコードを書き込むと、現在の行はロックされ、他のトランザクションは現在の行に対して操作できなくなります。
粒度は最も小さく、同時実行性は最も高く、ロックは頻繁に追加および解放されます。
ギャップロック: インターバルをロックします 条件範囲内で動作する場合、条件に合致したインターバルデータをロックします。
テーブル ロック: 特定のトランザクションが特定の行レコードに対して動作する場合、テーブル全体をロックできます。InnoDB ではほとんど使用されません。Myisam はテーブル ロックをサポートしています。
**共有ロック (S ロック)** 読み取りロックとも呼ばれます
**排他的ロック (X ロック)** 書き込みロックとも呼ばれます
クエリが必要な場合は、更新ステートメントの読み取り操作 select * from table name に排他ロックを追加することもできます。
1. オプティミスティック ロック: 実際にレコードの行をロックするのではなく、バージョン番号によって実装されます。
ロックされていないため、バージョン番号で区別できます。
2. 悲観的ロック: 上記の行ロック、ギャップ ロック、テーブル ロックなどはすべて悲観的ロックです。