データベースのロック機構との原則

転送https://blog.csdn.net/C_J33/article/details/79487941

データベースのロック
データベースのロック・ツリーの独自の種類のマップを見て

 

概要
データベースのロックは、一般に二つのカテゴリーに分けることができ、一方は悲観的ロックは、ロックが楽観的です。

オプティミスティック・ロックラッチ機構は、一般的に、一般的なデータは、その正式な紛争やデータは、データ内で検出されていない前に更新提出する時間であることを前提に、競合を作成しません、ユーザーの独自の実装を指し競合が見つかった場合、その後、ユーザーが何をすべきかを決定することができ、ユーザーはエラーメッセージを返してみましょう。楽観的ロックの実装は通常、バージョン番号とタイムスタンプが含まれます。

一般的には悲観的ロックは、我々は通常、以下の議論は、悲観的ロックに基づいており、そのデータベースのロック機構を言うことです。

悲観的なメインテーブル・ロック、行ロック、ページロックをロックします。唯一のMyISAMテーブルロックで使用では、デッドロックが生じない、ロックのオーバーヘッドが非常に小さいですが、非常に貧しいそれぞれの同時容量。InnoDBの器具行レベルロック、テーブルロック、ロック粒度強い小さく、同時容量が、対応するロックのオーバヘッドが増加すると、それはおそらくデッドロックすることです。一方inodbこれら2つのロックを調整する必要があり、アルゴリズムが複雑になります。InnoDBの行ロックは、インデックスのデータエントリロックを取得する指数は、そうでなければ、InnoDBのテーブルロックを使用する、唯一のInnoDBの行レベルのロックを介してのみインデックス条件を介して達成されます。

テーブル、行ロックが行ロック・プロモーション(排他ロックの共有ロック)を解決するために、共有ロックと排他ロック(排他ロック)に分割し、更新ロックされているデッドロックです。

一緒にInnoDBのテーブルと行ロックとは、それほど効率を向上させるために意図的ロック(インテント共有ロックと排他的ロックインテント)を有するであろう。

表ロックと行ロックの意思が存在する
公式文書がそのように記載されています、

意図ロックは、トランザクションがテーブルに行の後必要とするロックのタイプ(共有または排他)を示すテーブルレベルロックであります

以下のように、平和の非常に鮮やかな解釈を有することが知られて:

表ロックMySQLがあり、テーブルは、テーブルのデータを変更する他のトランザクションをブロックし、ロックを読み取ります。ライトテーブルロックは、読み書きする他のトランザクションをブロックします。
INNODBエンジンと支持行ロック、行ロックは共有ロックに分割され、トランザクションが読み取り専用ライン上の共有ロック。行排他ロック読み書きトランザクションの排他的ロック。
問題のロックのこれらの2つのタイプの共存は、この例を考えてみましょう:Aは、ラインのみを読むことができるように、テーブル内のトランザクション行をロックされて書き込むことはできません。トランザクションBは、テーブル全体に書き込みロックを適用します。トランザクションBアプリケーションが成功した場合、理論的には、行ロック競合を保持する、テーブルの任意の行を変更することができるであろう。データベースは、LETアプリケーションBが行ロックの解除までブロックされていることを、そのような競合を回避する必要があります。
どのようにこの紛争、それを判断するためのデータベース?

STEP1:表が他のトランザクションテーブルロック・ロック・テーブルで使用されているかどうかを決定する
テーブルの行ロックの各行がロックされているかどうかを決定する:STEP2。
注STEP2、効率を決定するためのそのような方法があるため、テーブル全体を横断する必要性、高くありません。そして、ロックする意図があります。意図的ロックの存在下でのトランザクションは、最初に成功したアプリケーションの行ロック行の後、テーブルの上に意図的共有ロックを適用しなければなりません。

意図的ロックの存在下で、上記の決意を変えることができます

STEP1:不変
ステップ2:いくつかの行は、行ロックが共有されているテーブルがロックされていること、したがって、トランザクションB申込書書き込みロックがブロックされる示すテーブルに意図共有ロックを見つけます。
注:応募者の意図ロック操作は、アプリケーションのある完全なデータベース、トランザクション行ロックAの行で、データベースを自動的に適用する意思の開始前にテーブルをロックします、我々は、プログラマが適用されるコードを使用する必要はありません。

細分行ロックは、
ロックを共有
ロックし、ロックを解除する:トランザクションは、SELECT文を実行すると、データベースシステムは、このトランザクションのために照会されているデータをロックするために共有ロックを割り当てます。デフォルトでは、データは、データベース・システムの共有ロックがすぐに解放され、読まれています。例えば、トランザクションは、クエリを実行する文、データベース・システムは最初読んだ後、最初の行のロックを解除し、最初の行をロックし、次いで第2行をロック「アカウントSELECT * FROM」。したがって、トランザクションの読み出し動作中に、更新に他のトランザクションを可能にしながら、テーブルの行がロックされていないアカウント。

互換性:データリソースに共有ロックを配置する場合は、共有ロックと更新ロックを配置することができます。

同時パフォーマンス:良い同時パフォーマンス、データ共有ロックが配置され、その後、共有または更新ロックを配置することができます。だから、良い同時パフォーマンス。

排他的ロック
ロックとロックを解除するには:トランザクションを実行すると、挿入、更新または削除ステートメントは、データベースシステムが自動的にSQL文は、排他ロックを使用してデータリソースを操作することになります。データリソースは、他のロックを(ロックなし)が存在している場合、それは、排他ロックを配置することはできません。

互換性:排他ロックと他のロックは、互換性がないことができ、データリソースが排他ロックを追加されている場合、あなたがロックされ、他のを配置することはできません。データ・リソースが既に他のロックを置いた場合も、それはもはや排他的にロック置くことができません。

同時パフォーマンス:最悪。他のものも、データにアクセスするために必要とされる場合は、アクセスデータへのトランザクションがロック可能にのみ、あなたは待たなければなりません。

更新ロック
リソースの初期段階でロックに更新ロックが発生共有ロックのデッドロックの使用を回避する、修飾されなければなりません。たとえば、次のUPDATE文について:

UPDATEは、アカウントのSETバランス= 900 ID = 1

- 1>更新操作が行われたアカウントテーブルのレコードIDの読み取り:更新操作は2つのステップが必要です。

あなたが最初のステップで共有ロックを使用する場合は、デッドロックの排他的ロックにロックをアップグレードするための第二段階が発生することがあります。たとえば、次のように両方のトランザクションが共有ロック同じデータリソースを取得し、その後、排他ロックにロックする必要がありますが、デッドロックになった排他ロック、への共有ロックを解放する前に、別のトランザクションを待つ必要。

更新ロックは、次の特徴があります。

ロックとロック解除:トランザクション更新文、データベース・システムは、トランザクションの更新ロックが割り当てられます。データの読み出しが完了すると、更新操作は排他ロックでロックを更新します実行されます。

互換性:更新ロックと共有ロックは、リソースを同時に更新ロックと共有ロックが、更新ロックアップの場所に置くことができると言うことですつまり、互換性があります。したがって、複数のトランザクションが同じデータを更新するとき、1つのトランザクションのみが更新ロックを取得し、その後、排他的ロックにロックを更新することができ、他のトランザクションがあまりにも取得更新ロックに前のトランザクションが終了するまで待たなければならない、そのことを回避しますデッドロック。

同時パフォーマンス:複数のトランザクションが同時にロックされたリソースを読み込むことができますが、それを修正することから、他のトランザクションを許可していません。

データベースの分離レベル
のデータのロック機構を理解するために、データベースの分離レベルは、より理解したいです。ロックの異なる程度を使用してデータの異なる要件を満たすために、各分離レベル。

READ UNCOMMITTED、読み出しおよび書き込みは、最悪のデータの一貫性をロックを使用していない、多くの論理エラーも発生します。

書き込みロックを使用して、コミット読み取りますが、読んで、一貫性のない、非反復可能読み取り。

反復可能読み取りは、読み取りおよび書き込みロックは非反復可能読み取りの問題を解決するために、使用しますが、ファントム読み取りがあるでしょう。

シリアライズ、バースト状トランザクションスケジューリングを使用する、発生の結果として、インサートをロックしない一貫性のないデータを回避します。

読書は、ダーティリード(READ UNCOMMITTED)、その結果、提出されていない
トランザクションは、トランザクションがエラーを引き起こす可能性が背中を丸めている場合、他のトランザクションのコミットされていないデータ変更を読み取ることができ、操作をお読みください。

例:AはBが終わっ戦うためにトランザクション100そのお金を読めば、同じデータベースに対して二つの動作は、次の2つのことになっているアカウントを、見てB、Bに100を打つが、Aの最後のトランザクションこれは、損失が生じ、ロールバック。

我々は、データを読み取る際にデータを書き込む際、データは、変更されないことを保証するために、ロック、別々の読み取りおよび書き込みを記述する必要があるときに、これらの事を避けるため、データが読み込まれません。このように、同時に確保することが、書き込みで書かれており、別のトランザクションを読み取ることができません。

読み取り(読み取りコミット)に提出
、私たちは、あなたがそのダーティリードを保証することができ、書き込みロックを追加してデータを読み込んだ後に提出されることを確実にするためですが、読書は時間ロックではないことを、再読み込みは発生しません読み出しトランザクションをこのプロセスは、データが二度読まれている場合、2つの書き込みトランザクションの修正データの間で、一貫性のない結果が論理的なエラーが発生し、二度読みにつながります。

再読み込み(反復可能読み取り)とすることができる
トランザクションは、複数の読み取り操作を持っている場合、読み取り結果のニーズが一致するように、繰り返し読んで、問題を解決しなければならない(固定データと一致していること、ファントムは、一貫性のないクエリの数を指し読み出します)。これは昇給がロックを読んで、ロックがすぐに解放された場合に、読んで保持していない、非反復可能読み取りがあるだろうではない読み込みロック場合、トランザクションは、ロックの問題をコミットするまでロックを読むかどうかのトランザクションをバック保持するかどうかに影響を持っています他のトランザクションが実行された場合、それは、別のトランザクションで変更することができる、この時点でのトランザクションが再度読み込まれる非反復可能読み取りがあるだろう、があり、

だから、書き込みおよびホールド時間がロックされている必要があり、トランザクションで開催されたロックは、非反復可能読み取りを保証することができます読んで、それが必要であるか、あるいはダーティリードがあるでしょう。反復可能読み取り(再読み込みすることができます)、MySQLが必要なときに平均読みの上、デフォルトのトランザクション分離レベルで、ロックされたまま

直列化(シリアライズ)
ファントム読み取りの問題を解決するには、同じトランザクション内で、同じクエリを繰り返し、一貫性のない結果が返されました。新しいクエリを実行するために、トランザクションAの提出の前と後の取引の記録、トランザクションB、時間と再び前のレコードよりも多くの発見後。魔法の読書は、新しいレコードのためにロックすることができないので、これは、記録することで解決反復不能読み取りロックのようではありません、レコードへの増加による同時トランザクションによるものです。トランザクションは、ファントム読み取りを回避するためにシリアル化する必要があります。
これは、問題ファントムリードを解決するように、互いに競合することができなくなって、トランザクションによってソートに強制され、分離の最高レベルです。要するに、それは、読み取られたデータの各行の共有ロックを追加することです。このレベルでは、タイムアウトやロック競合の多くにつながる可能性が
----------------

おすすめ

転載: www.cnblogs.com/KQNLL/p/11963884.html