分散トランザクションに関する面接で必ず聞くべき知識ポイント!

分散トランザクションに関する面接で必ず聞くべき知識ポイント!

[[433051]]

友人のほとんどは、面接官が面接中に投げかけた表面的な質問にしか答えないと思います。実際、面接官が尋ねる質問はすべてよく考えられたものです。

面接時間は比較的短いです。面接官が短時間であなたをよく知ることは不可能です。彼はいくつかの質問を通してあなたの知識の深さと広さをテストしたいと思っています。歯磨き粉を絞り出すように、少し質問して少し答えるといった、面接官の質問に対する表面的な答えしか行わないと、結果は明らかで、失敗するでしょう。

面接の質問

トランザクションとは何ですか?同時トランザクションによってどのような問題が生じますか?

問題を分析する

表面的には、面接官は2つの質問をしました。 1 つは、「トランザクションとは何か」です。これは、トランザクションの基本的な概念についてお話しいただくことです。もう 1 つは、同時トランザクションによってどのような問題が発生するかということです。

実際はそうではありません。面接官がこの質問をしているのを聞いたら、何気なく答えないでください。面接官がどのような答えを求めているかを少し考えてみます。

最初の質問: トランザクションとは何ですか?取引の基本的な概念について簡単に説明するように求められているだけですか?データベースを勉強した小学生でも基本的な概念は理解できると思います。面接官はなぜこの質問をするのでしょうか?

この時点で、面接官の心理を推測する必要があります。この時点で面接官が実際に聞きたいのは、トランザクションの基本的な概念だけでなく、トランザクションの特徴、つまり 4 つの主要な属性を述べることです。これが問題の核心です!

2 番目の質問: 同時トランザクションによってどのような問題が起こりますか?それがどんな問題をもたらすのかを聞きたいだけですか?問題はわかっていても解決方法がわからない場合、面接官はそのような面接者を受け入れることができるでしょうか?本質的に、面接官は、同時トランザクションによってどのような問題が発生するか、また、どのようなソリューションでこれらの問題を解決できるかを尋ねたいのです。これが面接官が求めている答えです!

要約すると、面接官が本質的に尋ねている質問は次のとおりです。取引とは何ですか?取引の 4 つの主要な特徴は何ですか?同時トランザクションによってどのような問題が生じますか?解決策は何ですか?面接官の質問の本質を深く理解して初めて、面接官の質問に適切に答えることができます。そうでなければ、あなたは面接官とやり取りし、面接官もあなたとやり取りすることになります。

トランザクションとは何ですか?

トランザクションの概念は比較的簡単に理解できます。トランザクションとは、単一の論理的な作業単位として実行される一連の操作を指し、完全に実行されるか、まったく実行されないかのいずれかです。

トランザクション処理により、トランザクション ユニット内のすべての操作が正常に完了しない限り、データ指向リソースが永続的に更新されないことが保証されます。関連する一連の操作を、すべてが成功するかすべてが失敗する単一のユニットに結合することで、エラー回復を簡素化し、アプリケーションの信頼性を高めることができます。

論理作業単位がトランザクションとして適格となるためには、いわゆる ACID (原子性、一貫性、独立性、および永続性) プロパティを満たす必要があります。トランザクションはデータベース操作における論理的な作業単位であり、DBMS のトランザクション管理サブシステムがトランザクションの処理を担当します。

取引の4つの特徴

原子性

トランザクションはアトミックな作業単位でなければなりません。データの変更はすべて実行されるか、まったく実行されません。たとえば、振替の場合、振替が成功して口座残高が増加(減少)するか、または、振替が失敗し、口座残高は変更されません。

一貫性

トランザクションが完了すると、すべてのデータが一貫した状態になっている必要があります。リレーショナル データベースでは、すべてのデータの整合性を維持するために、トランザクションの変更にすべてのルールを適用する必要があります。

トランザクションの終了時には、すべての内部データ構造 (B ツリー インデックスや二重リンク リストなど) が正しい必要があります。一貫性を維持する責任の一部はアプリケーション開発者にあり、アプリケーション開発者は、アプリケーションが既知の整合性制約をすべて適用していることを確認する必要があります。

たとえば、送金用のアプリケーションを開発する場合、送金処理中に小数点を恣意的に移動することは避ける必要があります。

分離

同時実行トランザクションによって行われた変更は、他の同時実行トランザクションによって行われた変更から分離する必要があります。トランザクションがデータを表示する場合、データの状態は、同時実行中の別のトランザクションによってデータが変更される前の状態、または別のトランザクションによって変更された後の状態のいずれかになります。トランザクションは中間状態のデータは表示しません。これを「分離」といいます。

開始データを再ロードし、一連のトランザクションを再生して、データが最後に元のトランザクションが実行されたときと同じ状態になるようにすることができるためです。トランザクションがシリアル化可能な場合、最高の分離レベルが達成されます。

このレベルでは、並列実行できる一連のトランザクションから得られる結果は、各トランザクションをシリアルに実行することによって得られる結果と同じです。高い分離レベルは並行して実行できるトランザクションの数を制限するため、一部のアプリケーションではスループットの向上と引き換えに分離レベルを下げます。

耐久性

トランザクションが完了すると、システムに対するその影響は永続的になります。この変更は、致命的なシステム障害が発生した場合でも維持されます。

たとえば、JDBC を使用してデータベースを操作する場合、トランザクション メソッドを送信すると、トランザクション操作が完了したことをユーザーに通知します。プログラムが実行され、プロンプトが表示されると、トランザクションを識別して正しく送信できます。現時点でデータベースに問題があったとしても、トランザクションを完全に完了する必要があります。そうでない場合、トランザクションが完了したというプロンプトが表示されますが、データベースは故障のためにトランザクションを実行せず、これは重大なエラーとなります。

同時トランザクションによって発生する問題

ダーティライト問題

更新の損失問題は、2 つ以上のトランザクションが同じ行を選択し、最初に選択した値に基づいて行を更新した場合に発生します。各トランザクションは他のトランザクションの存在を認識しません。最後の更新により、他のトランザクションによって行われた更新が上書きされ、データが失われます。

たとえば、T1 と T2 が同時にデータの一部を変更すると、T2 の変更によって T1 の変更が上書きされます。 T2 が T1 の後にのみ変更を行える場合、この問題は回避できます。

典型的な送金問題を見てみましょう。最初、シャオミンとシャオガンは両方とも1,000元を持っています。トランザクションT1では、Xiao MingがXiao Gangに100元を送金し、トランザクションT2では、Xiao GangがXiao Mingに200元を送金します。通常の状況では、結果は次のようになります: Xiao Ming は 1,100 元、Xiao Gang は 900 元です。ダーティライトの問題が発生した場合、結果は次のようになります: Xiao Ming は 1,200 元、Xiao Gang は 800 元を受け取ります。下の図の通りです。

ダーティリード問題

トランザクションがレコードを変更しています。トランザクションが完了してコミットされる前は、レコードのデータは不整合な状態になります。このとき、別のトランザクションも同じレコードを読み取ります。制御されていない場合、2 番目のトランザクションは「ダーティ」データを読み取り、それに基づいてさらに処理を実行し、コミットされていないデータ依存関係を生成します。この現象は、はっきりと「ダーティリーディング」と呼ばれます。

たとえば、トランザクションT1では、Xiao MingがXiao Gangに100元を送金しました。転送プロセス中に、トランザクションがコミットまたはロールバックされなかった場合、トランザクション T2 はトランザクション T1 のコミットされていないコンテンツを読み取ります。つまり、トランザクションT2では、Xiao Mingの900元とXiao Gangの1100元の記録が読み取られました。これは次の図で表すことができます。

繰り返し不可能な読み取りの問題

トランザクションが特定のデータを読み取った後のある時点で、以前に読み取ったデータを再度読み取ると、読み取ったデータが変更されていることがわかります。この現象は「非反復読み取り」と呼ばれます。

つまり、トランザクション T2 がデータを読み取った後、トランザクション T1 が更新操作を実行し、T2 が以前の結果を読み取ることができなくなります。

たとえば、トランザクション T1 では、Xiao Ming が Xiao Gang に 100 元を送金します。トランザクションがコミットされる前、トランザクション T2 で読み取られたデータは、Xiao Ming が 1,000 元を持ち、Xiao Gang が 1,000 元を持っているというデータのままです。トランザクション T1 がコミットされた後、トランザクション T2 で読み取られたデータは、Xiaoming の場合は 900 元、Xiaogang の場合は 1100 元です。下の図の通りです。

ファントムリード問題

トランザクションが同じクエリ条件に従って以前に取得したデータを再読み取りしたが、他のトランザクションがそのクエリ条件を満たす新しいデータを挿入したことがわかった場合、この現象は「ファントム リード」と呼ばれます。

トランザクション t2 は、トランザクション t1 によって送信された追加および削除されたデータを読み取りますが、これは分離要件を満たしていません。

ファントム リードと非反復リードはどちらも、コミットされた別のトランザクションを読み取ります (ダーティ リードとは異なります)。違いは、非反復読み取りでは同じデータ項目がクエリされるのに対し、ファントム読み取りではデータのバッチ全体 (データの数など) がクエリされることです。

たとえば、Xiaoming と Xiaogang という 2 つのデータがトランザクション T1 に挿入されます。トランザクションがコミットされる前、トランザクション T2 で読み取られるデータ レコードは 10 です。次に、トランザクション T1 がコミットされた後、トランザクション T2 で読み取られるレコードは、以下に示すように 12 になります。

同時トランザクション問題の解決策

上記の状況を回避するために、標準 SQL 仕様では 4 つのトランザクション分離レベルが定義されており、異なる分離レベルによってトランザクションの処理方法が異なります。次の 4 つの異なる分離レベルは、制限が低いものから高いものまで、パフォーマンスが高いものから低いものまであります。

コミットされていない読み取り

コミットされていない読み取り: ダーティ リードは許可されますが、更新が失われることは許可されません。トランザクションがデータの書き込みを開始した場合、別のトランザクションは同時に書き込むことはできませんが、他のトランザクションはこのデータ行を読み取ることができます。この分離レベルは、排他的書き込みロックを通じて実現できます。

ダーティ リード、反復不可能なリード、仮想リードは避けられません。

コミットされた読み取り

コミットされた読み取り: 繰り返し不可能な読み取りは許可しますが、ダーティ読み取りは許可しません。これは、「瞬間的な共有読み取りロック」と「排他的書き込みロック」によって実現されます。データを読み取るトランザクションでは、他のトランザクションが引き続きデータ行にアクセスできますが、コミットされていない書き込みトランザクションでは、他のトランザクションが行にアクセスできなくなります。

ダーティ リードは回避できますが、繰り返し不可能なリードと仮想リードは回避できません。 Oracle は Read Committed を使用します。

再現性

繰り返し読み取り: 繰り返し不可能な読み取りとダーティ読み取りは禁止されていますが、ファントム読み取りが発生する場合があります。これは、「共有読み取りロック」と「排他的書き込みロック」によって実現できます。データを読み取るトランザクションは書き込みトランザクションを禁止します (ただし、読み取りトランザクションは許可します)。また、書き込みトランザクションはその他のトランザクションを禁止します。

ダーティ リードと反復不可能なリードは回避できますが、誤ったリードは回避できません。 MySQL は繰り返し読み取りを使用します。

シリアル化

Serializable: 厳密なトランザクション分離を提供します。トランザクションをシリアルに実行する必要があります。トランザクションは 1 つずつしか実行できず、同時に実行することはできません。トランザクションのシリアル化は、単に「行レベルのロック」だけでは実現できません。新しく挿入されたデータがクエリ操作を実行したトランザクションによってアクセスされないようにするには、他のメカニズムを使用する必要があります。

ダーティ リード、反復不可能なリード、ファントム リードなどを回避できます。

4 つのトランザクション分離レベルを次の図にまとめます。

現在のデータベースのトランザクション分離レベルを頻繁にチェックします。「tx_isolation」などの変数を表示します。

トランザクション分離レベルを設定します: set tx_isolation='REPEATABLE-READ';

Mysql のデフォルトのトランザクション分離レベルは、繰り返し読み取りです。 Spring でプログラムを開発する場合、分離レベルが設定されていない場合は、Mysql で設定された分離レベルがデフォルトで使用されます。 Spring が設定されている場合は、設定されている分離レベルが使用されます。

この記事はWeChatの公開アカウント「Glacier Technology」から転載したものです。下のQRコードからフォローできます。この記事を転載する場合は、Glacier Technology 公式アカウントまでご連絡ください。

<<:  エッジコンピューティングが医療業界にもたらす変化

>>:  Funshine Sales の Luo Xu: SaaS サービスのネットワーク効果

推薦する

5つの異なるタイプのエッジソリューション

IDC の調査によると、人工知能、5G、ネットワーク、IoT テクノロジーの急増により、エッジ ソリ...

alpharacks-年間支払い$25/4コア/1gメモリ/2gスワップ/25gハードディスク/1.5Tトラフィック/

Alpharacksは稼働して1年以上経ちました。正直、どれくらい持つか不安でしたが、今は調子が良い...

予測:2021年、クラウドコンピューティングは5つの新たなトレンドを示す

2020 年のコロナウイルスのパンデミックは、2021 年に対するほとんどの人々の予測を覆しました。...

リソース統合を活用することで、効果的なウェブサイトプロモーション方法がさらに便利になります

ウェブサイトを宣伝する最も効果的な方法は何ですか?経験豊富なウェブマスターの中には、ゆっくりやれば長...

EduSoho ユーザー カンファレンスは「教育の未来」に焦点を当て、オンライン教育を強化する 4 つの新製品をリリースしました。

2019年12月20日、EduSoho(杭州国智ネットワークテクノロジー株式会社)が主催するグローバ...

草の根ウェブマスターは外部リンクなしで何ができるでしょうか?

Xianyun は次のように考えています: Baidu のニュース サイトや大規模 Web サイトに...

Douyin、Kuaishou、Taobao、Pin、ライブストリーミング電子商取引の戦い!

ライブストリーミングeコマースは今年本当に人気があります。少し前に、ライブストリーミング電子商取引が...

ネットショップの既存顧客の返品率を10%から30%に上げる方法

近年、タオバオの発展が加速するにつれ、多くの伝統産業が誘惑に抵抗できず、タオバオ軍に加わっています。...

国内最大のクラウドコンピューティング市場セグメントであるSaaSの概要

1. SaaSの主な特徴IaaS と比較すると、SaaS は主に企業や個人の特定の情報ニーズを解決し...

SEOウェブサイト監査を開始する方法

誰もが SEO 監査に精通していますが、SEO 監査をうまく行う方法をご存知ですか? Google ...

Google、Baiduなどのインデックス速度の自己テストの簡単な分析

テスト方法は、まずADMIN5とCHINAZフォーラムに「ピンイン入力方式の競争が激化、アリババも参...

基礎知識:分散SQLとは何か

[51CTO.com クイック翻訳] 過去 40 年近くにわたって、SQL はリレーショナル データ...

24 Dockerfileと指示のベストプラクティス

キャッシュを構築するイメージ構築プロセス中、Docker は Dockerfile で指定された順序...

百度の新方針のもとで敗者のウェブマスターの生き残り戦略を議論する

Baidu が最近実施した一連の主要なアルゴリズム アップデートにより、大多数の Web 管理者の生...

海外のさまざまなソーシャルプラットフォームがライブストリーミングeコマース市場への参入を急いでいるのでしょうか?

国内市場でライブストリーミングやソーシャルeコマースが大人気となっている中、海外のインターネット企業...