0、問題の概要
3.ストレージエンジン
1、(MySQL)存储引擎(*3)及区别(*2);InnoDB和MyISAM的区别(*2);
2、MongDB存储引擎。
4.並行性
1、锁作用;
2、悲观锁和乐观锁(*2)区别、实现和应用场景;
- 追问1:CAS是什么,导致的问题和解决方案? 【补充】
- 追问2:版本号如何实现? 【补充】
3、数据库死锁(*2),如何防止?
4、数据库如何给一个范围加锁,有几种方法去解决幻读?MySQL 间隙锁(*2),实现方式
5、锁实现?
6、手里同时有两个任务,如何处理?
3、ストレージエンジン
1.(MySQL)ストレージエンジン(* 3)と違い(* 2); InnoDBとMyISAMの違い(* 2)
特徴 | MyISAM | InnoDB | メモリー |
---|---|---|---|
トランザクションセキュリティと外部キー | N | Y | N |
ロック機構 | テーブルロック | 行ロック | テーブルロック |
- | - | - | - |
利点 | SELECTおよびINSERTベースのアプリケーションに適した高速アクセス速度 | 外部キー、トランザクションの整合性、同時実行の整合性などをサポートします。 | デフォルトのハッシュインデックスであるメモリストレージは、レコードをすばやく見つけることができます |
不利益 | トランザクションの整合性と並行性は適切ではありません | サービスが閉じられると、テーブル内のデータは失われます。低セキュリティ | |
シーン | Web、データウェアハウス | 請求および金融システム | 更新頻度の低い小さなテーブル(データベースの例外を確実に回復できるようにするため) |
2.MongDBストレージエンジン。
特徴 | WiredTiger | インメモリ |
---|---|---|
持久化 | ディスクファイルに保存 | キャッシュに保存 |
同時 | ほとんどの読み取りおよび書き込み操作は、楽観的同時実行制御を使用します | ファイルレベルの同時実行制御、同じドキュメントに対する複数の書き込み操作は、シリアル化された方法で実行する必要があります |
例外/クラッシュ | ログファイルを使用して、チェックポイント操作後に発生したデータ更新を復元できます。 | データは失われます |
4、並行性
1.ロックは何をしますか?
回答:データベースロックは、マルチユーザー共有リソースに正しく同時にアクセスし、リソースにアクセスするためのルールを合理的に設定することです。
2.悲観的ロックと楽観的ロック(* 2)の違いとアプリケーションシナリオ。
の種類 | 楽観的ロック | 悲観的なロック |
---|---|---|
概念 | 最初に使用してから、実際の更新中にデータが更新されたかどうかを判断します。成功を示すものではありません。そうでない場合は、ロールバックして再試行してください。 | 最初にロックを取得してから、業務を行ってください。 |
成し遂げる | バージョン番号、CAS | Java同期(バイアスロック+ 1.6以降の軽量ロックの最適化); MySQL-読み取りロック、書き込みロック、行ロック |
シーン | 続きを読み、書く量を減らす | 読みを減らし、もっと書く |
フォローアップ1:CASとは何ですか、それが引き起こす問題と解決策は何ですか?【補足】
1.1)CASとは何ですか?
答:CAS 操作中包含三个操作数:
- 需要读写的内存位置V
- 进行比较的预期原值A
- 拟写入的新值B
if isMatched(V, A) then A=B
else then A不变
1.2)CASはどのような問題を引き起こす可能性がありますか?
回答:ABA問題、長いサイクルタイムと高いオーバーヘッド、共有変数の1つのアトミック操作のみが保証されます
1.3)それを解決する方法は?
回答:
問題 | プログラム |
---|---|
ABA | バージョン番号を紹介します |
高価な | 終了メカニズム:再試行/しきい値の数を設定します |
単一の共有変数 | 複数の共有変数を1つに結合すると、複数の変数を1つのオブジェクトに入れることができます[AtomicReference] |
フォローアップ2:バージョン番号を実現する方法は?【補足】
回答:
-
获取当前version
-
if version = oldVersion, then set version = newVersion;
else update failed
-
コアSQL
update table set name = 'Aron', version = version + 1
where id = #{
id} and version = #{
version};
3.データベースのデッドロックを防ぐ方法は?
回答:
-
デッドロック状態が発生します
。1)1つのスレッドが2回ロックされます
。2)2つのスレッドが互いのロックに適用されますが、解放されません。 -
必要条件とデッドロックの防止
1)相互排除:一度に1つのプロセスのみがリソースを使用でき、他のプロセスは他のプロセスに割り当てられたリソースにアクセスできません。
–>デバイスの固有の属性が決定され、変更することはできません。
2)占有して待機する:プロセスが他のリソースが割り当てられるのを待機しているとき、プロセスは割り当てられたリソースを占有し続けます。
–>プロセスは、必要なすべてのリソースを一度に要求する必要がある場合がありますが、これは比較的非効率的です。
3)非プリエンプション:プロセスですでに占有されているリソースを強制的にプリエンプションすることはできません。
->一部のリソースがあるプロセスがそれ以上のリソース要求を拒否された場合、プロセスは元々占有していたリソースを解放する必要があります。
->プロセスが現在別のプロセスによって占有されているリソースを要求した場合、オペレーティングシステムは別のプロセスをプリエンプトし、リソースを解放するように要求できます。
4)循環待機:閉じたプロセスチェーンがあるため、各リソースは、チェーン内の次のプロセスに必要な少なくとも1つのリソースを占有します。
–>プロセスがRタイプのリソースを割り当てた場合、次のリクエストリソースは、Rタイプの後のタイプのリソースのみになります。これは、比較的非効率的です。 -
デッドロックに対処するには、デッドロックの防止、検出、回避、および解放の4つの方法があります。
方法 | コンテンツ |
---|---|
防止 | 必要条件を1つ破壊する |
検出 | 構造を確認し、時間内にクリアします |
避ける | プロセスの開始が拒否され、割り当てが許可されていません[銀行家のアルゴリズム] |
解除 | 資源剥奪法、失効処理法 |
4.データベースが範囲をロックする方法、ファントム読み取り、MySQLギャップロック(* 2)、実装方法を解決する方法はいくつかあります。
4.1ファントムリーディングとは何ですか?
回答:ファントム読み取りとは、トランザクションが同じ範囲を2回クエリしたときに、次に、前回は表示されなかった行を表示することを意味します。
注:
1)繰り返し可能な読み取り分離レベルでは、通常のクエリはスナップショット読み取りであり、他のトランザクションによって挿入されたデータは表示されません。ファントム読み取り値は「現在の読み取り値」の下に表示されます(最新のコミットレコードを確認できます)。
2)更新の結果は、ファントム読み取りとは言えず、「新しく挿入された行」のみを参照します。
4.2。ファントムリーディングの何が問題になっていますか?
1)意味の一貫性が破壊されます。行ロックでは、他のトランザクションがロックされた行に対して読み取りおよび書き込み操作を実行できないようにする必要がありますが、その行への新しい更新または挿入を防ぐことはできません。
2)データとログの論理的な不整合。
4.3。すべてのレコードにロックを追加します。これにより、新しく挿入されたレコードを防ぐことはできません。ファントムリーディングを解決する方法は?
回答:ファントム読み取りの理由は、行ロックは行のみをロックできるためですが、新しいレコードを挿入するアクションにより、レコード間の「ギャップ」が更新されます。ファントム読み取りの問題を解決するために、InnoDB
は2つの値の間のギャップをロックするギャップロック(ギャップロック)ギャップロックを導入しました。たとえば、6つのレコードを挿入すると、7つのギャップが発生します。
间隙锁与读写锁不太一样,跟间隙锁存在冲突关系的,是“往这个间隙中插入一个记录”这个操作,间隙锁之间不存在冲突关系。
间隙锁和行锁合称为next-key lock,每个next-key lock是前开后闭区间。如果把select * from t for update把整个表所有记录锁起来,就形成了7个next-key lock,分别是(-∞,0]、(0,5]、(5,10]、(10,15]、(15,20]、(20, 25]、(25, +supremum]。
注:ここでは、ギャップロックはオープン間隔として記録され、ネクストキーロックはフロントオープン間隔とバッククローズ間隔として記録されます。
4.4。ギャップロックはデッドロックに遭遇しますか?欠点は何ですか?
回答:はい、次の例ではデッドロックが発生します。
短所:ギャップロックの導入により、同じステートメントがより広い範囲をロックし、同時実行性に影響を与える可能性があります。
4.5。ギャップロックの欠点を回避する方法はありますか?
回答:ギャップロックは、繰り返し可能な読み取り分離レベルでのみ有効です。したがって、分離レベルが読み取りコミットに設定されている場合、ギャップロックはありません。ただし、同時に、発生する可能性のあるデータとログの不整合を解決する場合は、binlog形式をrowに設定する必要があります。
4.6。これはどのような問題をもたらしますか?
回答:特定のビジネスニーズの分析によると、それはさらに理解と詳細が必要です。..。
5、参照
1. MongoDBストレージエンジン:WiredTigerとインメモリ
2.「MySQLを簡単な方法で学習する」-第7章テーブルタイプの選択(ストレージエンジン)
3。楽観的ロック、悲観的ロック、これで十分です!
4.インタビューのための楽観的および悲観的ロック
5. [BATインタビュー質問シリーズ]インタビュアー:楽観的および悲観的ロックを知っていますか?
6.デッドロックの4つの必要条件とデッドロックの防止、検出、回避、および解放
7.デッドロックの生成、防止、回避、検出、および解放
8. 20 |ファントム読み取りとは何ですか。ファントム読み取りの問題は何ですか。?