セキュリティ上の問題(ダーティリード、反復不能読み取り、ファントム読み取りと悲観的ロックと楽観的ロック)MySQLのトランザクション

トランザクションはを参照する一連の操作が含まれ、多くの論理は、単一の
様々な論理ユニットの論理構成上の操作のセットを指しアクションのこのセットは、いずれかのすべて成功するか失敗する
限り、すべてのために、その後正常に実行失敗と見なされていないロジックがあるので、データがされてロールバックされ元の状態に

目的は、そのロジックが成功したか失敗であることを確認することです

しかし、セキュリティ上の問題があるかもしれ読み取りと書き込みのトランザクションが発生します。

[読み取りに問題

  • 図1は、ダーティ・リード
    別のトランザクションへのリードトランザクションデータを送信していない
    データベースへのトランザクションは、データAにアクセスしているときに、データが変更され、そのような修正はまだコミットされていない
    別のトランザクションBも、データにアクセスし、この時点でこのデータ
    この時点であれば、トランザクションがロールバックされた第2読取読み取りトランザクションBを汚れデータ
    データが再読み、それは元のデータになっているものので、

  • 2、非反復読み出し
    別のトランザクションにリードトランザクションをデータが送信さ複数のクエリ結果に矛盾得
    リードトランザクションAがされたときに、トランザクション・データをBを提出し、トランザクションが矛盾している前に、2つのリードデータにつながっ
    ているためBあなたはデータを見つけて、新しい(変更されたデータ)に変更されるデータの詳細読み取り場合は
    、この問題を解決するには、データを制限することであるが読み取ることができる唯一の完全にコミットされたトランザクションを変更した後

  • 図3は、ファントム読み取り
    トランザクションが他のトランザクションの読み取りコミット挿入されたデータが異なるために、複数のクエリ結果をもたらす
    テーブル内のすべてのデータ行を含むよう修飾修飾されたテーブル内の最初のトランザクション・データを
    同時にします2番目のトランザクションも、テーブルにこの表では、この修正を、データを修正し、新たなデータを挿入し
    、その後、最初のトランザクションを操作するユーザがしますテーブルのデータ行の修正がないことを見つける起こったかのように錯覚その名の魔法読みます

[書き込み]問題

  • ロストアップデートは✧
    また、データベースを変更し、別のトランザクションによってデータベースを変更するトランザクションを指し
    ているので、最終的なトランザクション、コミットまたはロールバックをするかどうか、取引のデータの損失、更新前原因
    、以前の取引後のデータがトランザクションの実行の背中を上書きされます

以下のために失われたアップデート解決策は2つあり悲観的ロックと楽観的ロックありました。

ペシミスティック・ロック:(

これは、を意味し、失われた更新が発生することを最初にトランザクションこれは、その名前を得た非常に悲観的なものです

具体的な手順:

  • 次のようにデータのクエリステートメントをクエリに進む前に、すべての問題がある1は、:
    select * from student for updateバック更新のためには、実際にデータベースのロック機構です排他ロック
    他のトランザクションは、操作がトランザクションが完了していないとき時に読みますが、書き込みや更新ませんすることができます
  • 2、このロックは、データをチェックアウトすることができ、保留中のトランザクションのトランザクションの文の最初の実装
    この文のトランザクションの実行の背後には、どのようなデータを持っていないだけで待つことができます
  • 図3は、前のトランザクションデータは、後に出てくるまで、トランザクションデータに提出して、前にダウンして動作されています

バスルームと同様にしゃがんだと人々に戻ることができ、誰もがだけ待たなければならないしなければならない
、それはで行くことができる前に内部の人だけを
コンセプトは、Javaでの同期のアイデアです

オプティミスティック・ロック:)

指し、失われた更新が発生したと感じたことがない、それはその名の非常に楽観的です

このアプローチは、データベース内のフィールドを追加するプログラマを必要と更新をするときの同じ後続の更新が許可されている場合、このフィールドに比べ次にであることを判断します

例:

  • 図1は、データベーステーブルは、余分なフィールドは、バージョンのバージョンを記録するために使用される追加
    テーブル内のデータの変更限りゼロからデフォルトをその+1にバージョン
  • 2、次にオープントランザクションAトランザクションBを開き
  • 図3に示すように、操作を実行するデータベース・テーブル
    誰もそれによってAが修正トランザクションデータベースを可能に改変されていなかったので、
    しかし、バージョンの値が1に入れた後修飾
  • それはデータベースのバージョン0に見なされる前に、データベースに照会Bの取引の内容の修正がないので4は、あなたが変更を実行する場合は、この時点でBのトランザクションが許可されていません
    が、これはので、データベースのバージョンは、A 1時間によって変更されている許可されていません再クエリに必要な変更
  • 5、B情勢再クエリデータはバージョン1になります後、このトランザクションデータは、Aは、前にデータを修正する
    修正後、その後、B一切のアップデートはないであろうような状況が発生した損失に基づいて修正されます

楽観的ロック機構により、実際にあるよりも、バージョンまたはフィールドを比較達成する方法
ソフトウェアのSVNやGITバージョンでこの機構を制御機構と同じです


公開された174元の記事 ウォンの賞賛5 ビュー24万+

おすすめ

転載: blog.csdn.net/Piconjo/article/details/104913676
おすすめ