友人のほとんどは、面接官が面接中に投げかけた表面的な質問にしか答えないと思います。実際、面接官が尋ねる質問はすべてよく考えられたものです。 面接時間は比較的短いです。面接官が短時間であなたをよく知ることは不可能です。彼はいくつかの質問を通してあなたの知識の深さと広さをテストしたいと思っています。歯磨き粉を絞り出すように、少し質問して少し答えるといった、面接官の質問に対する表面的な答えしか行わないと、結果は明らかで、失敗するでしょう。 面接の質問トランザクションとは何ですか?同時トランザクションによってどのような問題が生じますか? 問題を分析する表面的には、面接官は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 サービスのネットワーク効果
ウェブサイトを構築する際、ウェブサイトのブランチを構築する必要がよくあります。たとえば、情報サイトに...
「4Kで数秒で開ける高速VPSがおすすめ」このような要望をお持ちの方は多いようです!初心者にとって、...
新しいウェブマスターが生計を立てるためには、どのようなウェブサイトを構築すべきでしょうか?多くの新参...
近年、第14次5カ年計画以降、全国でデジタル政府構築が本格化しており、2035年までの長期目標では「...
この記事はWeChatの公開アカウント「Backend Technology Compass」から転...
人類が誕生して以来、データの記録と処理能力の探求は止まることはありませんでした。たとえば、古代におけ...
今年は私たちウェブマスターにとって大変な年です。外部リンクを貼るのが難しいだけでなく、検索エンジンに...
若い皆さん、Alpharacks は Windows 2008 Server のライセンス版である ...
georgedatacenter (2009 年設立) は現在、ロサンゼルス、カンザス、アムステルダ...
最近、20,000 を費やすと 120,000 の効果が得られる、3 分で 200,000 が入金さ...
ブログは個人のホームページであり、考えや日記をオンラインで書く場所でもあります。企業が自社を宣伝した...
Linux ネットワーク仮想化は、LXC プロジェクトのサブプロジェクトです。 LXC には、ファイ...
Baidu が外部リンクを公開して以来、多くのウェブサイトの外部リンクがインデックスされた後に削除さ...
Grassroots Network (www.20ju.com) の招待を受けて、草の根ネットユー...
v.ps運営チームは、皆様のご支援に感謝の意を表すため、最新の年末プロモーションをリリースしました。...