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

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

[[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 サービスのネットワーク効果

推薦する

#推奨# bacloud: 20% 割引/E3-1230v6/16gDDR4/2*1T/50T トラフィック

有名なリトアニアのホスティングプロバイダー bacloud は、ハロウィーン専用サーバープロモーショ...

WeChat:2年で15言語、100カ国以上で3億人のユーザーを獲得

出典:人民日報 著者:張易軒 周飛亜外国製品は入ってこられず、国内製品は出てこられない。中国のインタ...

Intuit が機械学習と人工知能に AWS を選択

米国シアトル、2017 年 11 月 27 日 – Amazon (NASDAQ: AMZN) グル...

テンセント対360不正競争事件の判決:360に500万元の支払い命令

新浪科技は4月25日午後、テンセントが奇虎360に対して起こしていた不正競争の訴訟が広東省高級人民法...

実行することで、新しいサイトの組み込み速度が向上し、3つの詳細を把握して、半分の労力で2倍の結果を達成できます。

新しいウェブサイトの立ち上げが成功するかどうかは、多くのウェブマスターの努力の成果です。そのため、多...

ウェブサイトのセキュリティと安定性を確保し、最適化を安心して行えるようにします。

ウェブサイトのセキュリティと安定性は、最適化担当者が注意を払う必要がある問題です。この 2 つの側面...

垂直型電子商取引の熱心な顧客が亡くなり、6000万ドルの投資が水の泡に

電子商取引業界の発展は、砂を洗い流す波のようなものです。潮が引くと、誰が裸で泳いでいるかがわかります...

クラウドコンピューティングがビジネスとITの関係をどのように再定義するか

企業が業務をクラウドに移行するという決定は、業務をデータセンター インフラストラクチャからクラウドに...

hostdare-25% 割引コード/KVM/C3 コンピュータ ルーム/$3.74/756M メモリ/17G ハード ディスク/1T トラフィック/Windows

Hostdare は本日、最小 80M ポートと 6 月 30 日まで有効な永久 25% 割引コード...

Ctripは支払いログの脆弱性にさらされ、ユーザーのクレジットカード情報が漏洩した。

新浪科技は3月22日夜、脆弱性報告プラットフォームWuyun.comが本日公式サイトでネットワークセ...

インド VPS: Windows/1G メモリ/2 コア/35g ハードディスク/500g トラフィック

2003 年から運営されているアメリカの老舗ホスティング会社、accuwebhosting をおすす...

ワインや飲料品のモールでブランドを宣伝する5つの方法の簡単な分析

電子商取引のブランドは、電子商取引ウェブサイトの成功の鍵であり、ユーザーがウェブサイトで消費するかど...

App Store が大規模なアプリ削除を実施中。なぜボードゲームが監視の対象となるのでしょうか?

App Store は多数のボードゲームをアプリから削除し、レビューの焦点に最近、App Store...

Baiduの最近のクレイジーなアップデートとアップグレードの歴史について簡単に説明します

あまり多くを語る必要はありません。最近、Baidu はユーザー エクスペリエンスのアップグレードと調...

SEO必須ガイド:最適化プロジェクトの運用プロセスの紹介

SEO 最適化サービスに携わる人にとって、最適化プロジェクトの運用手順を習得することは基本的な SE...