【データベース】同時制御
5492 ワード
データベースは共有リソースであり、複数のユーザが共有することができる.トランザクション単位でユーザー・プログラムの同時アクセスを管理し、リソース共有効率を向上させる.データの同時性は、複数のユーザーが同時にデータにアクセスできることを意味します.同時アクセスに競合はありますか?どのように制御しますか?
≪トランザクション|Transaction|emdw≫:ユーザー定義のデータベース操作シーケンス.これらの操作は全部するか、全部しないか、
トランザクションには
(1)損失修正:2つのトランザクションが同時に同じデータを読み出して修正し、結果としてコミットされた変更は前提トランザクションコミットの変更を上書きし、前のトランザクションの変更が失われた.効果はシリアル実行トランザクションと同等である.キー:トランザクションは、変更をコミットした時刻ライブラリのデータが元の読み出し時刻ライブラリのデータと一致するかどうかを識別する.
(2)繰り返し不可:同じトランザクションの前後2回にわたって読み込まれたデータが一致しない前後2回同じデータを読み出す、データが一致しない .前後2回同じ条件でデータを読み出す、得られた記録個数が異なる--幻読(3)汚れ読み汚れデータ:1つのトランザクションが別のトランザクションがコミットしていないデータを読み出す.
データの不一致の主な原因は
同時制御の主な技術はlocking、タイムスタンプtimestamp、楽観制御法optimistic scheduler、マルチバージョン同時制御multi-version concurrency control単一プロセッサであり、トランザクション
ブラックアウトプロトコル:1.一級ブラックアウトプロトコルは、物事TがデータRを修正する前に排他ロックを加え、物事が終わるまで解放する.2.レベル2のブラックアウトプロトコルは、レベル1のブラックアウトプロトコルに基づいてトランザクションTを増加するデータRを読み取る前にSロックを増加する必要があり、読み終わったらSロックを解放することができる.レベル3のブラックアウトプロトコルは、レベル1のブラックアウトプロトコルに基づいてトランザクションTを増やし、読み物データRの前にSロックを追加しなければならない.トランザクションが終了するまでロックとデッドロックを解放してロックを回避する簡単な方法は、まずサービス(飢え死にを避ける)デッドロックを回避することである.
ブラックアウトの粒度が大きいほど、システムのオーバーヘッドが大きくなり、性能が低くなります.複数の粒度ブラックアウト多粒度ブラックアウトは、
意向ロック(この部分はまだよく知られていませんが、後でまとめます)
ORACLEのロックは行レベルロックで、ロック粒度が小さい.Oracleの
SERIALIZABLEロー数の少ない短いトランザクションを変更する 読み取りを主とするロングトランザクション 他社のシステムは、この独立性レベルを実装する際に、読み取り、書き込みが速くロックされますが、Oracleでは、読み取りと書き込みの競合が少なく、読み取りと書き込みの競合が少ないため、シリアル・レベルでもスループットが良好です. このレベルでは、潜在的な競合をユーザーが処理する必要があります.Cannot serialize access error.
トランザクションのスループットが大きく、修正機会の多いトランザクションはREAD COMMITTED隔離レベルを採用する.適切な同時制御措置を採用する:悲観ロック、楽観ロック
悲観的なロック:同時衝突に対して悲観的な態度を取って、関連業務の同時衝突度が高いと思って、本事務が更新する予定の行をクエリーの時にロックして、それによって他の事務がこれらの行を更新することを阻止します;SELECT文の後にFOR UPDATEを加えてselect句の後にfor update nowaitでC/Sアーキテクチャで楽観的にロックすることもできます:同時衝突に対して楽観的な態度を取って、事務の同時衝突度が高くないと思って、更新する予定の記録に対してクエリーの時にロックしないで、本当に更新する時に更に検査して、後方ロックを検査します.
【説明】悲観的なロックは、データ更新がブロックされないことをユーザに知らせることができ、より詳細なデータベース内のデータが競合しない楽観的なロックである場合、ユーザがデータ更新操作を実行する場合、操作実行が変更された場合、システムは端末ユーザに操作が実行できないことを通知しなければならない.
①更新前にアプリケーションに必要な操作ラインの「前イメージ」を格納し、更新時に操作ラインの現在値と格納されている古いレコードを比較し、データが一致していれば同時衝突がないことを示し、更新をコミットする.そうでなければ、ビジネスロジックに基づいてさらに処理する必要があります.Selec col1,col2 from table into old_col1,old_col2 where primary_key =primary_key Update table Set col1 = :new_col1, col2 = :new_col2, …. Where primary_key = primary_key And col1 = :old_col1 And col2 = :old_col 2 If SQL%NOTFOUND//更新に失敗し、END IFをさらに処理
②ベーステーブルにデータバージョンを追跡できる特殊な列を使用します.バージョン管理フィールド を追加は、書き込みが必要なたびにタイムスタンプを比較するタイムスタンプフィールドを追加します.同時トランザクションは、コミットを更新するときに、現在のデータベース内のデータのタイムスタンプと自分が更新する前に取得したタイムスタンプの一貫性をチェックし、一致する場合はコミットします.そうしない場合はロールバックして破棄します.
③ORA_を使うROWCNダミー列.CREATE TABLEを使用してベース・テーブルを作成するときにROWDEPENDENCIESパラメータを追加すると、Oracleではデータの発行のたびにシステム・クロックSCNに基づいてローのORA_が作成されます.ROWCNダミー列〔デフォルトでは、Oracleはブロック・レベルでSCNを維持し、同じブロック上の複数行に対して1つのSCNを共有する〕.データ変更のコミット時に現在のORA_ROWCNとデータを修正する前に得られたORA_ROWCNは比較を行い、一致した説明データが他のトランザクションによって更新されていない場合、コミットする.そうでなければ、データが他のトランザクションによって更新されたことを示します.ロールバックし、変更を放棄します.
受注変更の例を考慮してデータベースを問合せ、結果は表示レイヤに返されます.ユーザがデータを編集して(時間がかかる可能性がある)修正データを提出するのは、業務全体の持続時間が長いため、上記の3ステップの操作を1つのトランザクションに置くと、いわゆる長いトランザクションが発生し、システムのスループットに影響を与える.1つの処理方法は、ビジネスを次の3つのステップに分け、2つのトランザクションで処理することです.トランザクション1:データベースをクエリーし、結果を表示レイヤに返します.ユーザー編集データ〔時間がかかる可能性がある〕トランザクション2:上記複数のトランザクションにまたがる修正データを提出する〔受注を取得するには1つのトランザクションを使用し、受注を更新するには別のトランザクションを使用する〕同時トラフィックは、従来のシリアル化隔離レベル、楽観ロック、悲観的に失効し、いわゆるオフライン楽観ロックオフライン悲観ロックを使用する必要がある
オフライン楽観ロック実装案:クエリー時にバージョン番号をSesionのようなコンテナに保存し、更新時に現在のバージョン番号とSessionのバージョン番号を比較します.楽観的なロックの案とは差が少ない.データ読み出しとデータ更新は2つのトランザクションで行われる場合に適用されます.同時衝突の可能性は小さく、〔トランザクションロールバックによる〕再修正の代価は小さい.
≪トランザクション|Transaction|emdw≫:ユーザー定義のデータベース操作シーケンス.これらの操作は全部するか、全部しないか、
です.トランザクションには
ACID
原子性(atomicity):データベースの論理単位、またはすべて実行するか、コンシステンシ(consistency):コンシステンシとは、データベースが何らかのコンシステンシ状態から別のコンシステンシ状態にのみ移行し、データベースが成功したトランザクションのコミット結果のみを含むことを意味します.独立性(Isolation):1つのトランザクションが他のトランザクションに干渉されない.持続性(Durability):トランザクションがコミットされると、データベース内のデータの変更は永続的になります.同時競合による不一致:
(1)損失修正:2つのトランザクションが同時に同じデータを読み出して修正し、結果としてコミットされた変更は前提トランザクションコミットの変更を上書きし、前のトランザクションの変更が失われた.効果はシリアル実行トランザクションと同等である.
(2)繰り返し不可:同じトランザクションの前後2回にわたって読み込まれたデータが一致しない
データの不一致の主な原因は
.
の両面性である:トランザクションを完全に隔離することはシリアルスケジューリングトランザクションとなり、システムの同時アクセスの性能が低い.我々は
、いくつかの不一致を許可し、リアルタイムで救済措置をとる.同時制御:
同時制御の主な技術はlocking、タイムスタンプtimestamp、楽観制御法optimistic scheduler、マルチバージョン同時制御multi-version concurrency control単一プロセッサであり、トランザクション
の実行は実際には交差する
の実行である.ブラックアウトプロトコル:1.一級ブラックアウトプロトコルは、物事TがデータRを修正する前に排他ロックを加え、物事が終わるまで解放する.2.レベル2のブラックアウトプロトコルは、レベル1のブラックアウトプロトコルに基づいてトランザクションTを増加するデータRを読み取る前にSロックを増加する必要があり、読み終わったらSロックを解放することができる.レベル3のブラックアウトプロトコルは、レベル1のブラックアウトプロトコルに基づいてトランザクションTを増やし、読み物データRの前にSロックを追加しなければならない.トランザクションが終了するまでロックとデッドロックを解放してロックを回避する簡単な方法は、まずサービス(飢え死にを避ける)デッドロックを回避することである.
ブラックアウトの粒度
ブラックアウトの粒度が大きいほど、システムのオーバーヘッドが大きくなり、性能が低くなります.複数の粒度ブラックアウト多粒度ブラックアウトは、
, ;
の各ノードが独立してロックされることを可能にすることを意味する.各ノードにロックをかけるとともに,このノードのすべての末裔ノードにも同型のロックが付加されることを示した.意向ロック(この部分はまだよく知られていませんが、後でまとめます)
ORACLEのロックは行レベルロックで、ロック粒度が小さい.Oracleの
.READ COMMITTED独立性レベルは、より多くの同時性を提供することができますが、一部のトランザクションに幻読みと再読み取りのリスクをもたらします.トランザクションのスループットが大きく、応答時間が短く、トランザクションのスループットが大きくなく、幻読みと繰り返し不可で正しくない結果をもたらすリスクが低い.このレベルでは、ユーザーがロック競合を検出する必要はありません.SERIALIZABLE
トランザクションのスループットが大きく、修正機会の多いトランザクションはREAD COMMITTED隔離レベルを採用する.適切な同時制御措置を採用する:悲観ロック、楽観ロック
悲観的なロック:同時衝突に対して悲観的な態度を取って、関連業務の同時衝突度が高いと思って、本事務が更新する予定の行をクエリーの時にロックして、それによって他の事務がこれらの行を更新することを阻止します;SELECT文の後にFOR UPDATEを加えてselect句の後にfor update nowaitでC/Sアーキテクチャで楽観的にロックすることもできます:同時衝突に対して楽観的な態度を取って、事務の同時衝突度が高くないと思って、更新する予定の記録に対してクエリーの時にロックしないで、本当に更新する時に更に検査して、後方ロックを検査します.
【説明】悲観的なロックは、データ更新がブロックされないことをユーザに知らせることができ、より詳細なデータベース内のデータが競合しない楽観的なロックである場合、ユーザがデータ更新操作を実行する場合、操作実行が変更された場合、システムは端末ユーザに操作が実行できないことを通知しなければならない.
楽観的ロックを実施する方法
①更新前にアプリケーションに必要な操作ラインの「前イメージ」を格納し、更新時に操作ラインの現在値と格納されている古いレコードを比較し、データが一致していれば同時衝突がないことを示し、更新をコミットする.そうでなければ、ビジネスロジックに基づいてさらに処理する必要があります.Selec col1,col2 from table into old_col1,old_col2 where primary_key =primary_key Update table Set col1 = :new_col1, col2 = :new_col2, …. Where primary_key = primary_key And col1 = :old_col1 And col2 = :old_col 2 If SQL%NOTFOUND//更新に失敗し、END IFをさらに処理
②ベーステーブルにデータバージョンを追跡できる特殊な列を使用します.
③ORA_を使うROWCNダミー列.CREATE TABLEを使用してベース・テーブルを作成するときにROWDEPENDENCIESパラメータを追加すると、Oracleではデータの発行のたびにシステム・クロックSCNに基づいてローのORA_が作成されます.ROWCNダミー列〔デフォルトでは、Oracleはブロック・レベルでSCNを維持し、同じブロック上の複数行に対して1つのSCNを共有する〕.データ変更のコミット時に現在のORA_ROWCNとデータを修正する前に得られたORA_ROWCNは比較を行い、一致した説明データが他のトランザクションによって更新されていない場合、コミットする.そうでなければ、データが他のトランザクションによって更新されたことを示します.ロールバックし、変更を放棄します.
create table dept ( Deptno char(4), dname varchar2(50), loc varchar2(50), Data number(7,2), constraint dept_pk primary key(deptno) ) ROWDEPENDENCIES select ORA_ROWSCN from scott.dept where deptno=‘0001’;
【オフライン楽観ロックとオフライン悲観ロック】
授業中の彭先生の事件
受注変更の例を考慮してデータベースを問合せ、結果は表示レイヤに返されます.ユーザがデータを編集して(時間がかかる可能性がある)修正データを提出するのは、業務全体の持続時間が長いため、上記の3ステップの操作を1つのトランザクションに置くと、いわゆる長いトランザクションが発生し、システムのスループットに影響を与える.1つの処理方法は、ビジネスを次の3つのステップに分け、2つのトランザクションで処理することです.トランザクション1:データベースをクエリーし、結果を表示レイヤに返します.ユーザー編集データ〔時間がかかる可能性がある〕トランザクション2:上記複数のトランザクションにまたがる修正データを提出する〔受注を取得するには1つのトランザクションを使用し、受注を更新するには別のトランザクションを使用する〕同時トラフィックは、従来のシリアル化隔離レベル、楽観ロック、悲観的に失効し、いわゆるオフライン楽観ロックオフライン悲観ロックを使用する必要がある
オフライン楽観ロック実装案:クエリー時にバージョン番号をSesionのようなコンテナに保存し、更新時に現在のバージョン番号とSessionのバージョン番号を比較します.楽観的なロックの案とは差が少ない.データ読み出しとデータ更新は2つのトランザクションで行われる場合に適用されます.同時衝突の可能性は小さく、〔トランザクションロールバックによる〕再修正の代価は小さい.