コンピューター ウィンドウズ インターネット

トランザクションが正常に完了したことをメッセージで伝えます。 銀行カード取引とは何ですか。 操作の禁止。 いわゆる「自動コミット」


保留中のトランザクション制御システムはsb-opknt.onlineで動作します。 このサイトにアクセスすると、131,269ルーブルの未完了の取引について知ることができます。 数時間以内に措置を講じてお金を引き出す必要があります。そうしないと、支払いがキャンセルされます。 プロジェクトが支払いを行っているかどうかを確認しました。

保留中のトランザクション制御システムは本当にあなたにお金を送りますか?

このサイトは、特定のPJSC「OPKNT」と通信するための電子メールアドレスのみを提供していました。 このPJSCに関する情報は見つかりませんでした。また、サイトの詳細は示されていませんでした。 その会社は明らかに架空のものでした。 免責事項は読みづらく、サイトの下部に配置されていました。 しかし、約束された収入についての声明は支払いの保証のない仮定として発表されたので、すべての訪問者はそれを読むべきです。

保留中のトランザクション制御システムからお金を受け取ることを期待する意味はありませんでした。 サイト上のメッセージ、取引番号、個人口座、金額など、すべての訪問者が同じになります。 金銭のキャンセルの可能性があるという事実は、サイトの疑わしい性質を示していました。

次のページにリダイレクトされました。これはおそらく個人アカウントです。 フォームにいくつかの番号を入力し、お金の引き出しを注文しました。 データが検証され、資金が送金されました。 私たちの間違った詳細に支払いを送ることができた可能性は低いですが、私たちに対する苦情はありませんでした。 選択した転送方法に対して、496ルーブルまたは396ルーブルのみを支払うように提案されました。 支払いは、詐欺を促進するのに役立つE-Payサービスで提供されました。これは、テストされたサイトを特定の方法で特徴づけました。

396ルーブルの支払いが行われた後、転送操作は続行されました。 予想通り、新たな障害が発生しました。受け取り側の銀行は取引を拒否しました。 テストされたサイトを作成した詐欺師は、1回の支払いで止まらず、次の支払い、文書作成サービスのために720ルーブルを要求しました。 ここの文書には誰も興味がありませんでした、それはお金を要求するための口実にすぎませんでした。 再びE-Payに送られました。

約束された131,269ルーブルは私たちに支払われないことを私たちは理解しました。 最初はだまされました。 サイト上のすべてのアクションが保護されているという声明は誤りであることが判明しました。サイトにはデータを保護するhttpsプロトコルがなく、有名なアンチウイルスは無意味な画像で表されていました。

不完全なトランザクションの制御システムに関する結果:

  • 指定されたサイトの情報が誤っている。
  • このリソースにアクセスしないでください。

詳細な概要については、ビデオを参照してください。

私たちはお金を稼ぐための実証済みの方法を公開しています。

詐欺師は、支払いの理由を思いついたときに創造的になります。 しかし、あなたが支払われることを期待してそれらを行うことは無意味です。 購読すると、メーリングリストからインターネット上で発生した詐欺について知ることができます。 私たちのチームの連絡先-。 テストサイトに関する提案を送信してください。

トランザクションの構造、トランザクション内の同時実行性、期間など、さまざまなプロパティに基づいて分類できるトランザクションのさまざまなモデルがあります。

現在、次のタイプのトランザクションが区別されています:フラットまたはクラシックトランザクション、チェーントランザクション、ネストされたトランザクション。

フラットまたは従来のトランザクションは、原子性、一貫性、分離、耐久性(強度)-ACID(原子性、一貫性、分離、耐久性)の4つの古典的なプロパティによって特徴付けられます。 従来のトランザクションは、ACIDトランザクションと呼ばれることもあります。 上記のプロパティは、次のことを意味します。

アトミック性(原子性)の特性は、トランザクションを全体として実行するか、まったく実行しないかで表されます。

Consistencyプロパティは、トランザクションが進行するにつれて、データが1つの一貫性のある状態から別の状態に移行することを保証します—トランザクションはデータの相互の一貫性を壊しません。

Isolationプロパティは、データベースアクセスの競合するトランザクションが物理的に順番に処理され、互いに分離されていることを意味しますが、ユーザーには並列に実行されているように見えます。

Durabilityプロパティは、次のように解釈されます。トランザクションが正常に完了した場合、トランザクションによって行われたデータの変更は、どのような状況でも(後続のエラーが発生した場合でも)失われることはありません。

トランザクションを完了するには2つのオプションがあります。 すべてのステートメントが成功し、トランザクション中にハードウェアまたはソフトウェアの障害が発生しなかった場合、トランザクションはコミットされます。

トランザクションのコミットとは、トランザクションの実行中に行われたデータベースの変更をディスクに書き込む行為です。

トランザクションがコミットされるまで、これらの変更をロールバックし、データベースをトランザクション開始時の状態に復元することができます。 トランザクションをコミットするということは、トランザクションのすべての結果が一定になることを意味します。 それらは、現在のトランザクションがコミットされた後にのみ他のトランザクションに表示されます。 この時点まで、トランザクションの影響を受けるすべてのデータは、現在のトランザクションの開始時の状態でユーザーに「表示」されます。

トランザクションの実行中に何かが発生して正常に完了できなくなった場合は、データベースを元の状態に戻す必要があります。 トランザクションロールバックは、SQLステートメントによって行われたすべてのデータ変更を現在の保留中のトランザクションの本体にロールバックするアクションです。



トランザクション内の各ステートメントは作業の一部を実行しますが、作業全体を正常に完了するには、すべてのステートメントを無条件に完了する必要があります。 トランザクション内のステートメントのグループ化は、グループ全体を全体として実行する必要があり、この実行を自動的にサポートする必要があることをDBMSに通知します。

ANSI / ISO SQL標準は、トランザクションモデルとCOMMITおよびROLLBACKステートメントの機能を定義します。 この標準では、トランザクションは、データベースの現在の状態を変更する、ユーザーによって開始された、またはプログラムに含まれている最初のSQLステートメントで始まると指定されています。 後続のすべてのSQLステートメントは、トランザクションの本体を構成します。 トランザクションは、次の4つの方法のいずれかで終了します(図11.1)。

COMMITステートメントは、トランザクションが正常に完了したことを意味します。 その使用により、現在のトランザクション内でデータベースに永続的な変更が加えられます。

ROLLBACKステートメントはトランザクションを中止し、このトランザクションの一部としてデータベースに加えられた変更をキャンセルします。 ROLLBACKを使用した直後に新しいトランザクションが開始されます。

現在のトランザクションが開始されたプログラムが正常に完了したということは、トランザクションが正常に完了したことを意味します(COMMITステートメントが使用されたかのように)。

プログラムが誤って終了すると、トランザクションが中止されます(ROLLBACKステートメントが使用されたかのように)。

このモデルでは、データベースの状態を変更する各ステートメントはトランザクションと見なされるため、このステートメントが正常に完了すると、データベースは新しい安定した状態になります。

商用DBMSの最初のバージョンは、ANSI / ISOトランザクションモデルを実装しました。 その後、拡張トランザクションモデルがSYBASE DBMSに実装されました。これには、いくつかの追加操作が含まれています。 SYBASEモデルは、次の4つの演算子を使用します。

BEGIN TRANSACTIONステートメントは、トランザクションの開始を報告します。 トランザクションの開始が最初のデータ変更ステートメントによって暗黙的に指定されるANSI / ISOモデルとは異なり、SYBASEモデルでは、トランザクションの開始はトランザクションの開始ステートメントを使用して明示的に指定されます。

COMMIT TRANSACTIONステートメントは、トランザクションが正常に完了したことを報告します。 これは、ANSI / ISO標準モデルのCOMMITステートメントと同等です。 この演算子は、COMMIT演算子と同様に、トランザクションの実行中にデータベースに加えられたすべての変更をコミットします。

SAVE TRANSACTIONステートメントは、このステートメントの実行時に保存されたデータベースの中間状態に対応するセーブポイントをトランザクション内に作成します。 SAVE TRANSACTIONステートメントには、セーブポイントの名前を含めることができます。 したがって、トランザクションの実行中に、いくつかの中間状態に対応するいくつかのセーブポイントが格納される場合があります。

ROLLBACKステートメントには2つの変更があります。 このステートメントを追加のパラメーターなしで使用すると、トランザクション全体のロールバックステートメントとして解釈されます。つまり、この場合、ANSI / ISOモデルのROLLBACKステートメントと同等です。 ロールバックステートメントにパラメータがあり、ROLLBACK Bとして記述されている場合、それはセーブポイントBへの部分的なトランザクションロールバックステートメントとして解釈されます。

拡張トランザクションモデルでトランザクションを実行する原理を図に示します。 11.2。 この図では、オペレーターに番号が付けられているため、考えられるすべてのケースでトランザクションの進行状況を追跡するのに便利です。

トランザクションは、トランザクションの開始の明示的な演算子で始まります。これは、スキームの番号1です。次は、検索演算子であり、データベースの現在の状態を変更しない演算子2と、次の演算子3および4です。データベースを新しい状態に転送します。 ステートメント5は、データベースのこの新しい中間状態を保存し、ポイントAで中間状態としてマークします。次に、ステートメント6と7が続き、データベースを新しい状態に転送します。 そして、オペレーター8は、この状態をポイントBの中間状態として保存します。オペレーター9は新しいデータ入力を実行し、オペレーター10は条件1のチェックを実行します。 条件1が満たされると、ステートメント11が実行され、トランザクションが中間状態Bにロールバックされます。これは、ステートメント9のアクションの結果が、いわば消去され、データベースが中間状態Bに戻ることを意味します。ステートメント9の実行後、それはすでに新しい状態にありましたが、トランザクションがロールバックされた後、以前に状態から実行されたステートメント9の代わりに、データベースでは、新しいデータを入力するステートメント13が実行され、その後、制御されます。ステートメント14は再び条件をチェックしますが、すでにいくつかの新しい条件2が条件を満たしている場合、制御はオペレーター15に移され、オペレーター15はトランザクションを中間状態A、つまりすべての状態にロールバックします。 6で始まり13で終わるデータベースを変更したステートメントは、実行されていないと見なされます。つまり、ステートメント4の実行後と同様に、実行結果が消え、再び状態Aになります。データベースの内容を更新する演算子17、その後の制御 決定は、チェック条件3に関連付けられているオペレーター18に転送されます。チェックは、トランザクションをコミットするオペレーター20に制御を転送することによって終了し、データベースは新しい安定状態になり、内で変更することはできません。または、制御がオペレーター19に移された場合、トランザクションは最初にロールバックされ、DBは初期状態に戻り、すべての中間状態がここですでにチェックされており、ロールバック操作を実行できません。ステートメント19の実行後、これらの中間状態に

もちろん、SYBASEの拡張トランザクションモデルは、はるかに柔軟なトランザクション実行メカニズムをサポートしています。セーブポイントを使用すると、トランザクション内でマーカーを設定できるため、トランザクションで実行された作業の一部のみを元に戻すことができます。ただし、特定のオペレータの変更を元に戻す機能これにより、システムリソースに追加のコストがかかります。オペレーターが作業を実行し、変更がキャンセルされます。通常、処理ロジックの改善がより良い解決策になる可能性があります。

1. トランザクションとブロッキング

2. トランザクションの概念

データベースを操作する場合、エラーと障害は除外されません。 これらは、DBMSと対話するユーザーのエラー、またはコンピューターの不安定な操作が原因である可能性があります。 したがって、DBMSは、このようなエラーの原因となったアクションをキャンセルするために特別な方法を使用します。 データベースの内容と構造に影響を与えるSQLコマンドは元に戻せません。 ユーザーは、アクションの終了後に何が起こるかを決定できます。データベースに加えられた変更をそのままにするか、無視するかです。 このため、データベースに対する一連の操作は、グループ(トランザクション)に結合されます。

トランザクション別データベースに対して実行され、ある一貫性のある状態から別の一貫性のある状態にデータベースを転送する一連の操作です。

トランザクションは、データベース上で分割できないアクションと見なされ、ユーザーの観点から意味があります。つまり、トランザクションはシステムの論理的な作業単位です。 データベースセッションが発生するたびにトランザクションが開始されます。

トランザクションの例は、ATM送金です。 量100tr。 現在のアカウントからカードアカウントに転送されます。 プログラムは現在の口座から金額を差し引き、それをカード口座に追加します。 プログラムの実行中、最初の変更を行った後、停電が発生し、カードアカウントは増加しません。 この状況を回避するには、両方のチームを1つのトランザクションにまとめる必要があります。 トランザクションのすべてのコマンドが実行されない場合、トランザクションはロールバックされます。

図書館で新しく受け取った本のデータを入力するためのトランザクションを定義しましょう。 この操作は、2つの連続した操作に分けることができます。最初に、本に関するデータの入力は、テーブルの新しい行です。 ..。 次に、本のすべてのコピーに関するデータを入力する必要があります。これは、テーブルへの新しい行のセットの入力です。 インスタンス。この一連のアクションが中断された場合、データベースは実際のオブジェクトに対応しないため、データベースに対して単一の作業として実行することが望ましいです。

3. トランザクションプロパティ。 トランザクション完了方法

トランザクション構造、トランザクション内の同時実行性、期間など、さまざまなプロパティに基づいて分類できるトランザクションのさまざまなモデルがあります。

現在、次のタイプのトランザクションが区別されています:フラットまたはクラシックトランザクション、チェーントランザクション、ネストされたトランザクション。

フラットトランザクションは、アトミック性、一貫性、分離、および耐久性という古典的な特性によって特徴付けられます。

· 原子性の特性は、トランザクションを全体として実行する必要があるか、まったく実行しない必要があるという事実で表されます。

· 整合性プロパティは、トランザクションが進行するときに、データが1つの整合性のある状態から別の整合性のある状態に移行することを保証します—トランザクションはデータの相互の整合性を壊しません。

· 分離プロパティとは、データベースへのアクセスをめぐって競合するトランザクションが物理的に順番に処理され、互いに分離されていることを意味しますが、ユーザーには並列に実行されているように見えます。

· 耐久性のプロパティは、トランザクションが正常に完了した場合、その後のエラーが発生した場合でも、トランザクションが行ったデータ変更がどのような状況でも失われないことを意味します。

トランザクションを完了するには、次の2つのオプションがあります。

· すべてのステートメントが成功し、トランザクション中にハードウェアまたはソフトウェアの障害が発生しなかった場合、トランザクションはコミットされます。 (コミットは、トランザクションの実行中に行われたデータベース内の変更のディスクへの書き込みです)。 トランザクションがコミットされていない限り、これらの変更をロールバックして、データベースをトランザクション開始時の状態に戻すことができます。 トランザクションをコミットするということは、トランザクションのすべての結果が一定になることを意味します。 それらは、現在のトランザクションがコミットされた後にのみ他のトランザクションに表示されます。

· トランザクションの実行中に障害が発生した場合は、データベースを元の状態に戻す必要があります。 トランザクションロールバックは、SQLステートメントによって行われたすべてのデータ変更を現在の保留中のトランザクションの本体にロールバックするアクションです。

4. 演算子取引SQLトランザクションを処理する

ANSI / ISO 定義された演算子 専念ロールバック、標準では、トランザクションの開始は最初のデータ変更演算子によって暗黙的に指定されます。 オペレーター 専念 トランザクションが正常に完了したことを意味し、トランザクションの結果は外部メモリに記録されます。 オペレーターがトランザクションを完了したとき ロールバック トランザクションの結果はキャンセルされます。 トランザクションが開始されたプログラムが正常に完了するとは、トランザクションが正常に完了することを意味します(オペレーターが専念 )、失敗した完了-トランザクションを中止します(オペレーターが使用されたかのように)ロールバック )。 このモデルでは、データの状態を変更する各ステートメントはトランザクションと見なされます。 このモデルは、商用DBMSの最初のバージョンに実装されました。 その後、拡張トランザクションモデルがSYBASEDBMSに実装されました。

拡張トランザクションモデル(たとえば、SQL SERVER DBMS)では、いくつかの追加操作が提供されます。

· オペレーター トランザクションの開始トランザクションの開始について通知します。

· オペレーター トランザクションのコミットトランザクションが正常に完了したことを報告します。 この演算子は、ANSI / ISO標準モデルのCOMMITと同様に、トランザクションの実行中にデータベースに加えられたすべての変更を修正します。

· オペレーター トランザクションを保存するこのステートメントの実行時に保存されたデータベースの中間状態に対応するセーブポイントをトランザクション内に作成します。 オペレーターで トランザクションを保存するセーブポイント名が存在する可能性があるため、トランザクションの実行中に、いくつかの中間状態に対応するいくつかのセーブポイントを格納できます。

· オペレーター ロールバック 2つの変更があります。 追加のパラメーターなしで使用された場合、パラメーターがあれば、トランザクション全体をロールバックする演算子として解釈されます。 ロールバックnの場合、トランザクションをセーブポイントnに部分的にロールバックする演算子として解釈されます。

セーブポイントは、特定のステートメントによって行われた変更を元に戻す機能を提供するために、長くて複雑なトランザクションで役立ちます。

ほとんどの場合、次のパラメータを設定できます 自動コミット 、実行されたすべてのコマンドを自動的に記憶し、エラーの原因となったアクションは常に自動的にキャンセルされます。 通常、このモードは次のようなコマンドで設定されます。

設定 自動コミット オン ;

リクエストの通常のダイアログ処理に戻ります。

設定 自動コミット オフ ;

また、インストールが可能です 自動コミット 、DBMSは登録時に自動的に実行されます。ユーザーセッションが異常終了した場合(たとえば、システム障害が発生した場合)、現在のトランザクションは変更を自動的にロールバックします。 単一のトランザクションに多くのコマンドが含まれるように、特に相互に関連しないように作業を整理することはお勧めしません。 これにより、変更がキャンセルされると、必要でエラーを引き起こさなかったアクションを含め、実行されるアクションが多すぎるという事実につながる可能性があります。 最適なオプションは、トランザクションが1つのコマンドまたはいくつかの密接に関連するコマンドで構成されている場合です。

トリガーは暗黙的に定義されたトランザクションとして実行されるため、トランザクション制御コマンドはトリガー内で許可されます。 特に、整合性制約の違反を見つけた場合は、次のコマンドを使用する必要があります ロールバックトランザクション ..。 トリガーが正常に完了すると、コマンドを使用できます 専念 取引 .
コマンドの実行 ロールバックトランザクション また 専念 取引 はトリガーを中断しないため、さまざまな条件が満たされたときにトランザクションを複数回ロールバックする試みを注意深く監視する必要があります。

取引例:

BEGIN TRAN

アカウントを更新する

SETバランス=バランス-100

@@エラー= 0の場合

始める

ロールバックトラン

戻る

終わり

card_accountを更新します

SETバランス=バランス+100

どこ [メール保護] _アカウント

@@エラー= 0の場合

始める

ロールバックトラン

戻る

終わり

COMMIT TRAN

指示 始める TRAN トランザクションの開始についてサーバーに通知します。 これは、サーバーがコマンドを受信する前に専念 TRAN すべての変更は一時的なものです。 したがって、最初の更新後にサーバーがクラッシュした場合、トランザクションはロールバックされます。 トランザクションが完了するまで、プロセスはデータにアクセスできません。

5. トランザクションログ。

中間状態の保持、トランザクションの確認またはロールバックの原則の実装は、トランザクションログと呼ばれるシステム構造が作成されたことをサポートする特別なメカニズムによって提供されます。 トランザクションログには、一連のデータベース変更レコードが含まれています。 データベースに信頼性の高いデータストレージを提供するように設計されています。 これは、あらゆる種類のハードウェアおよびソフトウェアの障害が発生した後、データベースの一貫した状態を復元できることを意味します。 ロギングとリカバリの一般原則:

· コミットされたトランザクションの結果は、データベースの復元された状態で保存する必要があります。

· コミットされていないトランザクションの結果は、データベースの復元された状態で存在してはなりません。

これは、データベースの最後の一貫した状態が復元されることを意味します。

データベースの状態を復元する必要がある次の状況が考えられます。

· RAMの内容の突然の喪失(ソフトグリッチ)からの回復。 この状況は、次の場合に発生する可能性があります。緊急電源オフ中、または致命的なプロセッサ障害が発生した場合。 この状況は、障害発生時にRAMバッファーにあったデータベースのその部分が失われることを特徴としています。

· メインの外部データベースメディアの故障からの回復(ハード障害)。

システムは、軽微な中断(トランザクションの失敗など)と重大な中断(停電、ハード障害など)の両方から回復できる必要があります。

ソフト障害が発生した場合は、ディスクに保存されているトランザクションログの内容からデータベースの内容を復元する必要があります。 ハード障害が発生した場合は、破損していない外部メディアに保存されているアーカイブコピーとトランザクションログからデータベースの内容を復元する必要があります。

ログ情報を維持するための2つの主なオプションがあります。 最初のオプションでは、このトランザクションによって、トランザクションごとに個別のローカルデータベース変更ログが維持されます。 これらのログはローカルログと呼ばれます。 これらは、トランザクションのローカルロールバックに使用されます。 さらに、一般的なデータベース変更ログが維持されます。これは、ソフト障害とハード障害の後にデータベースを回復するために使用されます。

このアプローチでは、個々のトランザクションのロールバックをすばやく実行できますが、ローカルログと共有ログの情報が重複します。 したがって、2番目のオプションがより頻繁に使用されます。一般的なデータベース変更ログのみを維持します。これは、個々のロールバックを実行するときにも使用されます。

ログの一般的な構造は、トランザクションの実行中に発生したデータベースへのすべての変更が記録されるシーケンシャルファイルの形式で表すことができます。 すべてのトランザクションには内部番号があるため、すべてのトランザクションによって行われたすべての変更はトランザクションログに記録されます。

各ログエントリは、それが属するトランザクションの番号とそれが変更する属性の値でマークされ、さ​​らに、トランザクションごとに、トランザクションを開始および終了するコマンドがログに記録されます。

信頼性を高めるために、トランザクションログはDBMSのシステムツールによって複製されることがよくあります。そのため、外部メモリの量はデータベース内の実際のデータ量の何倍にもなります。

トランザクションログには、遅延更新プロトコルと即時更新プロトコルの2つのオプションがあります。

遅延更新ロギングは、次のトランザクション実行メカニズムを前提としています。

1. トランザクションT1が開始されると、レコードがプロトコルに入力されます

T1 始める 取引

2. トランザクションの実行中に、変更されたレコードごとに新しい値がプロトコルに記録されます。

T1。 ID _ 記録 、属性、新しい値

(ID _ 記録 -一意のレコード番号)

3. トランザクションを構成するすべてのアクションが正常に完了すると、トランザクションは部分的に記録され、以下がプロトコルに入力されます。

NS 1 COMMT

4. トランザクションがコミットされた後、T1に関連するプロトコルレコードを使用してデータベースに変更を加えます。

5. 障害が発生した場合、DBMSはログを調べて、どのトランザクションをやり直す必要があるかを見つけます。 プロトコルに両方のレコードが含まれている場合は、トランザクションT1をやり直す必要があります T1 始める 取引 NS 1 COMMT . データベースは一貫性のない状態にある可能性がありますが、変更されたデータ項目のすべての新しい値がログに含まれているため、トランザクションを再実行する必要があります。 このために、システム手順が使用されます。REDO(), これは、ログを順方向にトラバースすることにより、すべてのアイテム値を新しい値に置き換えます。

6. ログにトランザクションをコミットするコマンドが含まれていない場合 OMMITの場合、アクションは不要であり、トランザクションが再開されます。

即時実行を伴う代替メカニズムは、データベースに直接変更を加えることを提供し、新しいだけでなく、変更された属性のすべての古い値もプロトコルに入力されるため、各レコードは次のようになります:

T1。 ID _ 記録 、属性、新しい値古い値

この場合、ログへの書き込みは、データベースでの操作の直接実行に先行します。 トランザクションがコミットされたとき、つまりコマンドが検出されたとき T1コミット、実行されると、すべての変更がデータベースですでに行われているため、このトランザクションに関してこれ以上のアクションは必要ありません。

トランザクションがロールバックされると、システムプロシージャが実行されます 元に戻す()、キャンセルされたトランザクションのすべての古い値を返し、コマンドから始めてプロトコルを順番に通過します トランザクションを開始します。

フェイルオーバーには次のメカニズムが使用されます。

· トランザクションにトランザクションを開始するコマンドが含まれているが、実行の確認を伴うコミットコマンドが含まれていない場合、アクションのシーケンスは、トランザクションがロールバックされたときと同じように実行されます。つまり、古い値が復元されます。

実際、回復はより複雑なアルゴリズムに従って行われます。 ログとデータベースの両方の変更は、すぐには記録されませんが、バッファリングされます。 変更ログは、トランザクション管理だけでなく、RAM内のデータベースページのバッファリングにも密接に関連しています。 データベースの変更操作を実行するときにログに記録されるはずのデータベースの変更に関するレコードが実際にすぐに外部メモリに書き込まれた場合、これはシステムの大幅な速度低下につながります。 したがって、ログレコードもバッファリングされます。通常の操作では、次のページは、レコードがいっぱいになった場合にのみログの外部メモリにプッシュされます。

6. ロックします。

マルチユーザーシステムでは、複数のユーザーまたはアプリケーションを同じデータベースで同時に実行できます。 DBMSの主なタスクの1つは、ユーザーを確実に分離することです。つまり、各ユーザーがデータベースのみを使用していると思われるように、このような操作モードを作成します。 このようなDBMSタスクは通常、トランザクション並列処理と呼ばれます。

並列データベース処理には、主に3つの問題があります。

§ 欠落している変更 ..。 この状況は、2つのトランザクションがデータベース内の同じレコードを同時に変更する場合に発生します。 たとえば、2人のオペレーターが注文を取り、最初のオペレーターが30台のモニターを注文しました。 彼が倉庫に行ったとき、40台のモニターがあり、クライアントからの確認を受けて、40台のうち30台のモニターを販売しました。彼と並行して、2人目のオペレーターが働き、20台の注文を受け付けます。同じモニターを使用し、次に倉庫に連絡すると、同じ値の40を取得し、顧客に注文します。 データの処理を終了すると、彼はコマンドを実行します アップデート、これにより、ウェアハウス内の残りのモニターとして20が追加されます。 その後、最初のオペレーターは顧客との作業を終了し、コマンドも実行します 更新、残りの10個を在庫のモニター数として記録します。 彼らは40台のうち合計50台のモニターを販売し、10台のモニターが在庫にありました。

§ 中間データの問題 ..。 中間データにアクセスする機能に接続されています。 最初のオペレーターが顧客と交渉して、注文した30台のモニターを入力したが、注文を確定する前に、顧客が製品のいくつかの特性を調べたいと考えたとします。 最初のオペレーターが使用しているアプリケーションは、ウェアハウス内の残りのモニターを既に変更しており、残りの10台のモニターに関する情報がそこに保存されています。 このとき、2人目のオペレーターが顧客から20台のモニターを注文しようとしていますが、彼のアプリケーションでは、倉庫にモニターが10台しか残っておらず、オペレーターは顧客を拒否せざるを得ないことが示されています。 この時点で、最初のオペレーターの顧客はモニターを購入しないことを決定し、オペレーターはトランザクションをロールバックし、倉庫には40台のモニターがあります。 この状況は、2番目のオペレーターのアプリケーションが最初のアプリケーションによって形成された中間データにアクセスできるために可能になりました。

§ 一貫性のないデータの問題。 データ変更の可能性に関連 x、すでに読んだx 別のアプリケーションによって。 両方のオペレーターがほぼ同時に作業を開始し、40台のモニターの初期倉庫状態を受け取り、最初のオペレーターが30台のモニターを顧客に販売します。 彼はアプリケーションを終了し、COMMITトランザクションコミットコマンドを実行します。 データベースの状態は一貫しています。 この時点で、2番目のオペレーターの顧客が注文を決定し、2番目のオペレーターがデータに再度アクセスすると、モニターの数が変更されたことがわかります。 2番目のオペレーターは、トランザクションの整合性が侵害されていると考えています。 1つの仕事の過程で、彼は2つの異なる倉庫の州を受け取りました。 この状況は、1番目の演算子のアプリケーションが、2番目の演算子のアプリケーションによってすでに読み取られているデータタプルを変更できたために発生しました。

リストされた問題を要約すると、2つの並列トランザクション間の次のタイプの競合を区別できます。

· W-W-トランザクション2は、トランザクション1によって変更されたが終了しなかったオブジェクトを変更しようとします。

· R-W-トランザクション2は、トランザクション1によって読み取られた、終了しなかったオブジェクトを変更しようとします。

· W-Rトランザクション2は、終了していないトランザクション1によって変更されたオブジェクトを読み取ろうとします。

7. トランザクションのシリアル化

このような競合を回避するには、同時トランザクションを一貫して実行するための手順を開発する必要があります。 この手順は、次のルールに準拠する必要があります。

1. トランザクションの実行中、ユーザーには一貫性のあるデータのみが表示されます。 ユーザーには、一貫性のない中間データが表示されないようにする必要があります。

2. DB 2でトランザクションが並行して実行される場合、トランザクションの実行結果は、トランザクション1、次にトランザクション2が実行された場合、またはその逆の場合と同じである必要があります。

これらの原則を実装する手順は、トランザクションのシリアル化と呼ばれます。 これにより、データベースにアクセスする各ユーザーが、同じデータに同時にアクセスする他のユーザーがいないかのようにデータベースを操作できることが保証されます。 トランザクションの共同実行の結果は、同じトランザクションのいくつかの順次実行の結果と同等です。

最も簡単な方法はトランザクションの順次実行ですが、このような終了は時間の観点から最適ではなく、データベースへの並列アクセスを制御するためのより柔軟な方法があります。 これらの問題を解決するための最も一般的なメカニズムは、トランザクションの全期間にわたってオブジェクト(テーブルなど)をロックすることです。 トランザクションがロックされたオブジェクトにアクセスする場合、オブジェクトのロックが解除されるまで保留状態のままになり、その後、オブジェクトの処理を開始できます。 ただし、ブロッキングによって新しい問題が発生します。ブロッキングによるトランザクションの遅延です。

したがって、同期オブジェクトキャプチャとも呼ばれるロックは、さまざまなタイプのオブジェクトに適用できます。 最大のブロッキングオブジェクトはデータベース全体である可能性がありますが、このタイプのブロッキングにより、このデータベースを操作する他のすべてのアプリケーションがデータベースにアクセスできなくなります。 次のタイプのロックオブジェクトはテーブルです。 テーブルを操作するトランザクションは、トランザクションの全期間にわたってテーブルをロックします。 このタイプのロックは、他のテーブルで動作する同時トランザクションを許可するため、前のロックよりも適しています。

多くのDBMSは、ページレベルのロックを実装しています。 この場合、DBMSは、トランザクションがページにアクセスしたときにのみ、ディスク上の個々のページをロックします。 このタイプのロックはさらにソフトであり、異なるデータページにアクセスする場合、異なるトランザクションが同じテーブルで動作できるようにします。

一部のDBMSでは、行レベルのロックが可能ですが、そのようなロックメカニズムをサポートするには追加のコストが必要です。 SQL Serverは、同時実行性を最大化するためにレコードレベルのロックを設定するように努めています。 行ロックの数が増えると、レコード数がしきい値を超えた場合、サーバーはページロックに移行できます。

8. リクエストレベルでロックを上書きします。 ロックタイプ

文中のテーブル名の後の場合 から次のキーワードのいずれかが続きます。要求はロックマネージャに干渉し、指定されたロックタイプが適用されます。

· NOLOCK-ダーティな読み取りを許可します。

· PAGLOCK-ページレベルのロック。

· ROWLOCK-レコードレベルでのブロック。

· TABLOCK-共有テーブルロック。

· TABLOCKX-専用テーブルロック

現在、ブロッキングの問題は多くの研究の対象となっています。

ロックには2つの基本的なタイプがあります(同期グリップ)。

共有(非ハード)ロック-このモードは、オブジェクトの共有キャプチャを意味し、オブジェクトに対して読み取り操作を実行するために使用されます。 この方法でロックされたオブジェクトは、トランザクションの実行中に変更されず、他のトランザクションで使用できますが、読み取りモードでのみ使用できます。

排他的(ハード)ロック-このロックの所有者以外はデータにアクセスできません。 これらのロックは、テーブルの内容または構造を変更するコマンドに使用され、トランザクションが終了するまで有効です。

複数の読み取りトランザクションによるオブジェクトのキャプチャには互換性があります。つまり、複数のトランザクションが同じオブジェクトを読み取ることができます。 ある読み取りトランザクションによるオブジェクトのキャプチャは、書き込みによる同じオブジェクトの別のトランザクションによる別のキャプチャと互換性がありません。 異なる書き込みトランザクションによる同じオブジェクトのキャプチャには互換性がありません。

ただし、さまざまなタイプのロックを使用すると、デッドロックの問題が発生します。 デッドロックの問題は、オペレーティング環境での並列プロセスの実行を検討するときに発生し、共有(共有)オブジェクトの管理にも関連していました。 デッドロックの例:トランザクションAがテーブル1をハードロックし、次にテーブル2をハードロックするとします。一方、トランザクションBは、テーブル2をハードロックし、次にテーブル1をハードロックします。

これらのトランザクションの両方が同時に機能し始めた場合、最初のテーブルで変更操作を実行した後、両方とも無限の待機状態になります。トランザクションAは、トランザクションBが完了してテーブル2のロックを解除するのを待ち、トランザクションBは、トランザクションAが完了し、テーブル1のロックが解除されるのを無駄に待ちます。

状況ははるかに複雑になる可能性があります。 相互にブロックされるトランザクションの数は、はるかに多くなる可能性があります。 各トランザクションは、この状況を単独で検出することはできません。 それはDBMSによって解決されなければなりません。 ほとんどの商用DBMSには、このようなデッドロックを検出するメカニズムがあります。

デッドロックの検出は、トランザクション待機グラフの作成(または維持)に基づいています。 待機中のグラフは、トランザクションの名前が配置されている頂点にある有向グラフにすることができます。 トランザクションT1がトランザクションT2の終了を待機している場合、矢印はT1の上部からT2の上部に移動します。 さらに、矢印には、ブロックされたオブジェクトの名前とブロックのタイプをマークできます。

ロックメカニズムは、ロック分離レベルの概念を使用して、ロックされるテーブルの数を決定します。 従来、3つのレベルの分離が使用されています。

· 再読み取りと呼ばれる分離レベルは、特定のトランザクション内で、クエリによって取得されたすべてのレコードを変更できないようにする戦略を実装します。 これらのレコードは、トランザクションが完了するまで変更できません。

· 安定性ポインタと呼ばれる分離レベルは、各レコードが読み取られている間は変更されないようにしたり、変更されている間は読み取られないようにします。

· 安定性の3番目のレベルは、読み取り専用と呼ばれます。 読み取り専用はテーブル全体をロックするため、更新コマンドでは使用できません。 したがって、読み取り専用は、クエリ出力がテーブルデータと内部的に整合していることを保証します。

したがって、DBMSの同時実行制御ツールは、同時に発行されたコマンドがどの程度相互に干渉するかを決定します。 最新のDBMSでは、運用チームに最大のデータベースパフォーマンスとデータ可用性を提供することを考慮して、最適なソリューションを自動的に見つける適応可能なツールです。

9. 制御の質問

1. トランザクションを定義します。 取引の例を挙げてください。

2. トランザクションのプロパティを一覧表示して特徴づけます。

3. トランザクションを完了するための可能なオプションは何ですか。

4. 言語の演算子は何ですか SQL 拡張トランザクションモデルのトランザクションを処理するのに役立ちますか?

5. トリガーでトランザクション制御コマンドを使用できますか?

6. トランザクションログとは何ですか?

7. トランザクションログからデータベースの回復はどのような場合に実行されますか?

8. トランザクションログにはどのようなオプションがありますか?

9. トランザクションログオプションの違いは何ですか:遅延更新プロトコルと即時更新プロトコル。

10. ユーザーがデータベースと並行して作業する場合、どのような問題が発生しますか?

11. ユーザー分離の原則を実装するためにロックできるデータベースオブジェクトは何ですか?

12. クエリでブロッキングのタイプを設定することは可能ですか?

13. 複数のトランザクションによるオブジェクトのキャプチャにはどのような種類がありますか? どれが互換性がありますか?

14. 行き止まりの問題は何ですか?

トランザクションの構造、トランザクション内の同時実行性、期間など、さまざまなプロパティに基づいて分類できるトランザクションのさまざまなモデルがあります。

現在、次のタイプのトランザクションが区別されています:フラットまたはクラシックトランザクション、チェーントランザクション、ネストされたトランザクション。

フラットまたは従来のトランザクションは、原子性、一貫性、分離、耐久性(強度)-ACID(原子性、一貫性、分離、耐久性)の4つの古典的なプロパティによって特徴付けられます。 従来のトランザクションは、ACIDトランザクションと呼ばれることもあります。 上記のプロパティは、次のことを意味します。

· 原子性特性(Atomicity)は、トランザクションが全体として完了するか、まったく完了しないかで表されます。

· 一貫性プロパティ(一貫性)は、トランザクションが進行するにつれて、データが1つの一貫性のある状態から別の状態に移行することを保証します-トランザクションはデータの相互の一貫性を壊しません。

· 分離特性(分離)とは、データベースへのアクセスをめぐって競合するトランザクションが物理的に順番に処理され、互いに分離されていることを意味しますが、ユーザーには並列に実行されているように見えます。

· 耐久性(耐久性)は次のように解釈されます。トランザクションが正常に完了した場合、トランザクションによって行われたデータの変更は、いかなる状況でも(その後のエラーの場合でも)失われることはありません。

トランザクションを完了するには2つのオプションがあります。 すべてのステートメントが成功し、トランザクション中にハードウェアまたはソフトウェアの障害が発生しなかった場合、トランザクションはコミットされます。

トランザクションのコミットとは、トランザクションの実行中に行われたデータベースの変更をディスクに書き込む行為です。

トランザクションがコミットされるまで、これらの変更をロールバックし、データベースをトランザクション開始時の状態に復元することができます。 トランザクションをコミットするということは、トランザクションのすべての結果が一定になることを意味します。 それらは、現在のトランザクションがコミットされた後にのみ他のトランザクションに表示されます。 この時点まで、トランザクションの影響を受けるすべてのデータは、現在のトランザクションの開始時の状態でユーザーに「表示」されます。

トランザクションの実行中に何かが発生して正常に完了できなくなった場合は、データベースを元の状態に戻す必要があります。 トランザクションロールバックは、SQLステートメントによって行われたすべてのデータ変更を現在の保留中のトランザクションの本体にロールバックするアクションです。

トランザクション内の各ステートメントは作業の一部を実行しますが、作業全体を正常に完了するには、すべてのステートメントを無条件に完了する必要があります。 トランザクション内のステートメントのグループ化は、グループ全体を全体として実行する必要があり、この実行を自動的にサポートする必要があることをDBMSに通知します。

ANSI / ISO SQL標準は、トランザクションモデルとCOMMITおよびROLLBACKステートメントの機能を定義します。 この標準では、トランザクションは、データベースの現在の状態を変更する、ユーザーによって開始された、またはプログラムに含まれている最初のSQLステートメントで始まると指定されています。 後続のすべてのSQLステートメントは、トランザクションの本体を構成します。 トランザクションは、次の4つの方法のいずれかで終了します(図11.1)。

1. COMMITステートメントは、トランザクションが正常に完了したことを意味します。 その使用により、現在のトランザクション内でデータベースに永続的な変更が加えられます。

2. ROLLBACKステートメントはトランザクションを中止し、このトランザクションの一部としてデータベースに加えられた変更をキャンセルします。 ROLLBACKを使用した直後に新しいトランザクションが開始されます。

3.現在のトランザクションが開始されたプログラムが正常に完了したということは、トランザクションが正常に完了したことを意味します(COMMITステートメントが使用されたかのように)。

4.誤ったプログラム終了は、トランザクションを中止します(ROLLBACKステートメントが使用されたかのように)。

このモデルでは、データベースの状態を変更する各ステートメントはトランザクションと見なされるため、このステートメントが正常に完了すると、データベースは新しい安定した状態になります。

商用DBMSの最初のバージョンは、ANSI / ISOトランザクションモデルを実装しました。 その後、拡張トランザクションモデルがSYBASE DBMSに実装されました。これには、いくつかの追加操作が含まれています。 SYBASEモデルは、次の4つの演算子を使用します。

・BEGIN TRANSACTIONステートメントは、トランザクションの開始を示します。 トランザクションの開始が最初のデータ変更ステートメントによって暗黙的に指定されるANSI / ISOモデルとは異なり、SYBASEモデルでは、トランザクションの開始はトランザクションの開始ステートメントを使用して明示的に指定されます。

・COMMIT TRANSACTIONステートメントは、トランザクションが正常に完了したことを報告します。 これは、ANSI / ISO標準モデルのCOMMITステートメントと同等です。 この演算子は、COMMIT演算子と同様に、トランザクションの実行中にデータベースに加えられたすべての変更をコミットします。

・SAVE TRANSACTIONステートメントは、このステートメントの実行時に保存されたデータベースの中間状態に対応するセーブポイントをトランザクション内に作成します。 SAVE TRANSACTIONステートメントには、セーブポイントの名前を含めることができます。 したがって、トランザクションの実行中に、いくつかの中間状態に対応するいくつかのセーブポイントが格納される場合があります。

・ROLLBACK演算子には2つの変更があります。 このステートメントを追加のパラメーターなしで使用すると、トランザクション全体のロールバックステートメントとして解釈されます。つまり、この場合、ANSI / ISOモデルのROLLBACKステートメントと同等です。 ロールバックステートメントにパラメータがあり、ROLLBACK Bとして記述されている場合、それはセーブポイントBへの部分的なトランザクションロールバックステートメントとして解釈されます。

米。 11.1。ANSI / ISOトランザクションモデル

拡張トランザクションモデルでトランザクションを実行する原理を図に示します。 11.2。 この図では、オペレーターに番号が付けられているため、考えられるすべてのケースでトランザクションの進行状況を追跡するのに便利です。

米。 11.2。拡張モデルでトランザクションを実行する例

トランザクションは、トランザクションの開始の明示的な演算子で始まります。これは、スキームの番号1です。次は、検索演算子であり、データベースの現在の状態を変更しない演算子2と、次の演算子3および4です。データベースを新しい状態に転送します。 ステートメント5は、データベースのこの新しい中間状態を保存し、ポイントAで中間状態としてマークします。次に、ステートメント6と7が続き、データベースを新しい状態に転送します。 そして、オペレーター8は、この状態をポイントBの中間状態として保存します。オペレーター9は新しいデータ入力を実行し、オペレーター10は条件1のチェックを実行します。 条件1が満たされると、ステートメント11が実行され、トランザクションが中間状態Bにロールバックされます。これは、ステートメント9のアクションの結果が、いわば消去され、データベースが再び中間状態に戻ることを意味します。 B、ステートメント9の実行後、それはすでに新しい状態にありましたが。 そして、トランザクションのロールバック後、状態から以前に実行されたステートメント9の代わりに、データベースでは、新しいデータを入力するステートメント13が実行され、制御がステートメント14に移されます。ステートメント14は再び条件をチェックしますが、すでにいくつか新しい条件2; 条件が満たされた場合、制御はオペレーター15に移され、オペレーター15はトランザクションを中間状態Aにロールバックします。つまり、データベースを変更した6から13で終わるすべてのオペレーターは、満たされていないものと見なされます。 、実行結果が消え、再び状態になります。そして、演算子4を実行した後と同様に、次に、制御が演算子17に移され、データベースの内容が更新された後、制御が演算子18に移されます。はチェック条件3に関連付けられています。チェックは、トランザクションをコミットするオペレーター20に制御を移すことによって終了し、データベースは新しい1つの定常状態になり、現在のトランザクション内で変更することはできません。 または、制御がオペレーター19に移された場合、トランザクションは最初にロールバックされ、データベースは初期状態に戻ります。ここではすべての中間状態がすでにチェックされており、これらの中間状態へのロールバック操作を実行することはできません。演算子19を実行した後の状態。

もちろん、SYBASEの拡張トランザクションモデルは、はるかに柔軟なトランザクション実行メカニズムをサポートしています。 セーブポイントを使用すると、トランザクション内でマーカーを設定できるため、トランザクションで実行された作業の一部のみを元に戻すことができます。 長くて複雑なトランザクションでセーブポイントを使用して、特定のステートメントに元に戻す機能を提供することをお勧めします。 ただし、これはシステムリソースの追加コストにつながります。オペレーターが作業を実行し、変更がキャンセルされます。 通常、処理ロジックの改善がより良い解決策になる場合があります。

トランザクションログ

中間状態の保持、トランザクションの確認またはロールバックの原則のDBMSでの実装は、特別なメカニズムによって提供され、そのサポートのために、と呼ばれる特定のシステム構造が作成されます。 トランザクションログ。

ただし、トランザクションログの目的ははるかに広いです。 データベースに信頼性の高いデータストレージを提供するように設計されています。

そして、この要件は、特に、あらゆる種類のハードウェアおよびソフトウェアの障害後にデータベースの一貫した状態を復元する機能を意味します。 明らかに、復元を実行するにはいくつかの追加情報が必要です。 最新のリレーショナルDBMSの圧倒的多数では、このような冗長な追加情報は、データベース変更ログの形式で維持されます。 トランザクションログ。

したがって、データベースの変更をログに記録する全体的な目標は、障害が発生した後でもデータベースを一貫した状態に復元できるようにすることです。 データベースの整合性を維持するための基礎はトランザクションメカニズムであるため、ロギングとリカバリはトランザクションの概念と密接に関連しています。 回復の一般的な原則は次のとおりです。

・コミットされたトランザクションの結果は、データベースの復元された状態で保存する必要があります。

・コミットされていないトランザクションの結果は、データベースの復元された状態で存在してはなりません。

これは、実際には、データベースの最新の一貫性のある状態が復元されていることを意味します。

データベースの状態を復元する必要がある次の状況が考えられます。

・トランザクションの個別のロールバック。 このロールバックは、次の場合に適用する必要があります。

oトランザクションロールバックの標準的な状況は、ROLLBACKステートメントによる明示的な完了です。

oアプリケーションプログラムの異常終了。これは、論理的にはROLLBACKステートメントの実行と同等ですが、物理的には異なる実行メカニズムを備えています。

oトランザクションの並列実行でデッドロックが発生した場合のトランザクションの強制ロールバック。 このような場合、デッドロックを解消するために、このトランザクションを「犠牲者」として選択し、DBMSカーネルによる実行を強制的に終了することができます。

・RAMの内容が突然失われた後の回復(ソフト障害)。 この状況は、次の場合に発生する可能性があります。

o電源の緊急シャットダウンの場合。

o回復不能なプロセッサ障害(たとえば、RAM制御の操作)などが発生した場合。この状況は、障害時にRAMバッファに含まれていたデータベースのその部分が失われることを特徴としています。

・データベースのメイン外部メディアの故障からの回復(ハード障害)。 最新の外部メモリデバイスの信頼性が十分に高いことを考えると、この状況は比較的まれにしか発生しませんが、それでも、DBMSはこの場合でもデータベースを復元できるはずです。 リカバリの基本は、アーカイブコピーとデータベース変更ログです。

トランザクションを個別にロールバックするときにデータベースの一貫性のある状態を復元するには、そのトランザクションで実行されたデータベース変更ステートメントの影響を排除する必要があります。 ソフト障害が発生した場合にデータベースの一貫性のある状態を復元するには、ディスクに保存されているトランザクションログの内容からデータベースの内容を復元する必要があります。 ハード障害が発生した場合にデータベースの一貫性のある状態を復元するには、損傷を受けていない外部メディアに保存されているアーカイブコピーとトランザクションログからデータベースの内容を復元する必要があります。

3つのケースすべてにおいて、冗長データストレージがリカバリの基盤です。 この冗長データは、一連のデータベース変更レコードを含むログに保存されます。

ログ情報を維持するための2つの主なオプションがあります。 最初のオプションでは、トランザクションごとに個別のローカルデータベース変更ログがそのトランザクションによって維持されます。 これらのログはローカルログと呼ばれます。 これらはトランザクションの個々のロールバックに使用され、RAM(より正確には仮想)メモリに保持できます。 さらに、一般的なデータベース変更ログが維持されます。これは、ソフト障害とハード障害の後にデータベースの状態を回復するために使用されます。

このアプローチでは、個々のトランザクションのロールバックをすばやく実行できますが、ローカルログと共有ログの情報が重複します。 したがって、2番目のオプションがより頻繁に使用されます。データベース変更の一般的なログのみを保持します。これは、個々のロールバックを実行するときにも使用されます。 次に、この特定のオプションについて検討します。

ログの一般的な構造は、トランザクションの実行中に発生するデータベースへのすべての変更を記録するシーケンシャルファイルの形式で条件付きで表すことができます。 すべてのトランザクションには独自の内部番号があるため、すべてのトランザクションによって行われたすべての変更は、単一のトランザクションログに記録されます。

トランザクションログの各エントリには、それが属するトランザクションの番号と、変更する属性の値がマークされています。 さらに、トランザクションごとに、トランザクションを開始および終了するコマンドがログに記録されます(図11.3を参照)。

信頼性を高めるために、トランザクションログは商用DBMSのシステムツールによって複製されることがよくあります。そのため、外部メモリの量は、ストレージに格納されている実際のデータの量の何倍にもなります。

トランザクションログには、遅延更新プロトコルと即時更新プロトコルの2つの選択肢があります。

保留中の変更ログは、トランザクションを実行するために次のメカニズムを前提としています。

1.トランザクションT1が開始されると、レコードがプロトコルに入力されます

<Т1 Begin transaction>

2.トランザクションの実行中に、変更されたレコードごとに新しい値がプロトコルに書き込まれます。 ..。 ここで、ID_RECORDは一意のレコード番号です。

3. T1トランザクションを構成するすべてのアクションが正常に完了した場合、トランザクションは部分的に記録され、プロトコルに入力されます。<Т1 СОММIТ>.

4.トランザクションがコミットされた後、T1に関連するプロトコルレコードを使用して、データベースに適切な変更を加えます。

5.障害が発生した場合、DBMSはログを調べて、どのトランザクションをやり直す必要があるかを見つけます。 プロトコルに両方のレコードが含まれている場合は、トランザクションT1をやり直す必要があります<Т1 BEGIN TRANSACTION и <Т1 СОММIТ>..。 データベースは一貫性のない状態にある可能性がありますが、変更されたデータ項目のすべての新しい値がログに含まれているため、トランザクションを再実行する必要があります。 このために、いくつかのシステム手順REDOQが使用されます。これは、データ項目のすべての値を新しい値に置き換え、プロトコルを直接の順序で調べます。

6.プロトコルにCOMMITトランザクションコミットコマンドが含まれていない場合、アクションは不要であり、トランザクションが再開されます。

米。 11.3。トランザクションログ

即時実行の代替メカニズムは、データベースにすぐに変更を加えることを提供し、新しいだけでなく、変更された属性のすべての古い値もプロトコルに入力されるため、各レコードは次のようになります<Т1, ID_RECORD, атрибут новое значение старое значение...>..。 この場合、ログへの書き込みは、データベースでの操作の直接実行に先行します。 トランザクションがコミットされたとき、つまりコマンドが検出されたとき<Т1 СОММIТ>そしてそれが実行されると、すべての変更がデータベースですでに行われ、このトランザクションに関してそれ以上のアクションは必要ありません。

トランザクションがロールバックされると、UNDO()システムプロシージャが実行され、キャンセルされたトランザクションのすべての古い値が返され、BEGINTRANSACTIONコマンドで始まるプロトコルが順番に実行されます。

フェイルオーバーには次のメカニズムが使用されます。

・トランザクションにトランザクションを開始するコマンドが含まれているが、実行の確認を伴うコミットコマンドが含まれていない場合、アクションのシーケンスは、トランザクションがロールバックされたときと同じように実行されます。つまり、古い値が復元されます。 。

・最後のDB変更コマンドが実行された後、commitコマンドが実行される前に障害が発生した場合、commitコマンドが実行され、データベースは変更されません。 作業はプロトコルレベルでのみ行われます。

・ただし、ログとデータベースの両方への変更がすぐに記録されるのではなく、バッファリングされることを考えると、リカバリの問題は前述のアルゴリズムよりもはるかに複雑に見えることに注意してください。 次のセクションではこれについて説明します。

ロギングとバッファリング

変更ログは、トランザクション管理だけでなく、データベースページをメモリにバッファリングすることにも密接に関連しています。

データベース変更操作のログに記録されるはずのデータベース変更レコードが実際にすぐに外部メモリに書き込まれた場合、システムの速度が大幅に低下します。 したがって、ログレコードもバッファリングされます。通常の操作では、次のページは、レコードがいっぱいになった場合にのみログの外部メモリにプッシュされます。

課題は、データベースがクラッシュから回復できるようにするための一般的なプッシュポリシーを設計することです。

トランザクションの個々のロールバックでは問題は発生しません。これらの場合、メインメモリの内容が失われることはなく、データベースのログバッファとページバッファの両方の内容を使用できるためです。 ただし、ソフト障害が発生してバッファの内容が失われた場合、データベースを回復するには、ログと外部メモリ内のデータベースの状態に一貫性を持たせる必要があります。

ログバッファとデータベースページバッファをポップするための一貫したポリシーの基本的な信条は、変更されたオブジェクトが外部データベースメモリに入る前に、データベースオブジェクトへの変更を外部ログメモリに書き込む必要があるということです。 対応するロギング(およびバッファリング管理)プロトコルは、ログ先行書き込み(WAL)と呼ばれます-「ログに最初に書き込む」であり、変更されたデータベースオブジェクトを外部メモリに書き込む場合は、最初に次のことを確認する必要があります。トランザクションログは、その変更の外部メモリレコードに書き込まれます。

つまり、変更操作が実行されたデータベースの外部メモリにデータベースオブジェクトがある場合、ログの外部メモリには、この操作に対応するレコードが必ず存在します。 逆は当てはまりません。つまり、ログの外部メモリにデータベースオブジェクトを変更する操作に関するレコードが含まれている場合、変更されたオブジェクト自体がデータベースの外部メモリに存在しない可能性があります。

バッファをプッシュするための追加の条件は、正常に完了した各トランザクションを実際に外部メモリにコミットする必要があるという要件によって課せられます。 どちらの障害が発生した場合でも、システムは、障害時にコミットされたすべてのトランザクションの結果を含むデータベースの状態を復元できる必要があります。

簡単な解決策は、ログバッファポップと、それに続くトランザクションによって変更されたデータベースページバッファのバルクポップです。 これは非常に頻繁に実行されますが、コミット操作を実行するときにかなりのオーバーヘッドが発生します。

データベースの最後の一貫性のある状態を復元できるようにするための最小要件は、トランザクションがコミットされると、このトランザクションによるすべてのデータベース変更レコードがログの外部メモリにプッシュされることです。 この場合、このトランザクションのために作成されたログの最後のレコードは、トランザクションの終了に関する特別なレコードです。

次に、システムがすべてのトランザクションに対してバッファリングされた共通のログを維持し、WALプロトコルに従って維持されている場合に、さまざまな状況でデータベースの復元操作を実行する方法を見てみましょう。

トランザクションの個別のロールバック

一般ログで個別のトランザクションロールバックを実行できるようにするために、このトランザクションのすべてのログレコードは逆リストでリンクされます。 失敗したトランザクションのリストの一番上は、このトランザクションによって行われた最後のデータベース変更です。 完了したトランザクション(個別のロールバックが不可能になった)の場合、リストの先頭はトランザクションの終了のレコードであり、必ずログの外部メモリにプッシュされます。リストの末尾は常に最初です。このトランザクションによって行われたデータベース変更の記録。 通常、各レコードには一意のトランザクションIDが割り当てられるため、データベース変更レコードの直接リストを特定のトランザクションで復元できます。

したがって、個々のトランザクションのロールバック(これはコミットされていないトランザクションでのみ可能であることをもう一度強調します)は次のように実行されます。

・このトランザクションのリストから次のレコードが選択されます。

・反対の操作が実行されます。INSERT操作の代わりに対応するDELETE操作が実行され、DELETE操作の代わりにINSERT操作が実行され、直接UPDATE操作の代わりに逆UPDATE操作がデータベースの以前の状態を復元します。物体。

・これらの逆の操作もログに記録されます。 実際には、これは個別のロールバックには必要ありませんが、トランザクションの個別のロールバックを実行すると、ソフト障害が発生する可能性があります。回復時に、個別のロールバックが完全に完了していないトランザクションをロールバックする必要があります。

・ロールバックが正常に完了すると、トランザクションの終了の記録がログに書き込まれます。 ログの観点から、このようなトランザクションはコミットされます。

ソフト障害からの回復

ソフト障害からの回復に関する主要な問題の1つは、単一の論理データベース変更操作で、データページや複数のインデックスページなどの複数の物理データベースブロックを変更できることです。 データベースページはRAMにバッファリングされ、個別にポップされます。 WALプロトコルを使用しているにもかかわらず、ソフト障害の後、データベースの外部メモリ内のページのセットに一貫性がないことが判明する場合があります。つまり、外部メモリページの一部は変更前のオブジェクトに対応し、一部は変更前のオブジェクトに対応します。 -変更後。 論理レベルの操作は、オブジェクトのこの状態には適用されません。

データベースの外部メモリの状態は、すべてのオブジェクトのページセットが一貫している場合、つまり、変更前または変更後のオブジェクトの状態に対応している場合、物理的に一貫していると呼ばれます。

ログは、データベースの物理的な一貫性のポイントをマークしていると想定します。つまり、外部メモリに、対応する時点より前に完了した操作の一貫した結果が含まれ、次のような操作の結果はありません。完了せず、ログバッファが外部メモリにプッシュされます。 物理的な一貫性をどのように達成できるかについては、少し後で見ていきます。 そのような点をtpc(物理的一貫性の時間)と呼びましょう-物理的合意の点。

その後、ソフト障害が発生するまでに、次のトランザクション状態が発生する可能性があります。

・トランザクションが正常に完了しました。つまり、COMMITトランザクションの操作が確認され、トランザクションのすべての操作について、外部メモリでの実行の確認が受信されました。

・トランザクションは正常に完了しましたが、一部の操作では、外部メモリでの実行の確認が受信されていません。

・トランザクションがROLLBACKコマンドを受信して​​実行しました。

・トランザクションは完了していません。

物理データベースの一貫性

データベースに物理的な整合性のポイントがあることをどのように確認できますか。つまり、tpcの時点でデータベースの状態を復元する方法です。 これを行うために使用される主なアプローチは2つあります。シャドウベースのアプローチと、ページごとのデータベース変更のログを使用するアプローチです。

ファイルが開かれると、その論理ブロックの番号を外部メモリの物理ブロックのアドレスにマッピングするためのテーブルがRAMに読み込まれます。 ファイルのいずれかのブロックが変更されると、新しいブロックが外部メモリに割り当てられます。 この場合、(RAM内の)現在のマッピングテーブルが変更され、シャドウテーブルは変更されません。 開いているファイルの操作中に障害が発生した場合、開く前のファイルの状態が自動的に外部メモリに保存されます。 ファイルを明示的に復元するには、シャドウマッピングテーブルをRAMに再読み込みするだけで十分です。

シャドウメカニズムの一般的な考え方を図に示します。 11.4。

米。 11.4。シャドウ表示テーブルの使用

データベースのコンテキストでは、シャドウメカニズムは次のように使用されます。 チェックポイントは定期的に実行されます。 これを行うために、すべての論理演算が完了し、メインメモリのすべてのバッファ(その内容が外部メモリの対応するページの内容に対応していない)が押し出されます。 データベースファイルをマッピングするためのシャドウテーブルが現在のテーブルに置き換えられます(より正確には、現在のマッピングテーブルがシャドウテーブルの場所に書き込まれます)。

tpcへのリカバリは瞬時に行われます。現在のマッピングテーブルはシャドウテーブルに置き換えられます(リカバリ中、シャドウマッピングテーブルは単に読み取られます)。 すべてのリカバリの問題は解決されますが、外部メモリの過剰使用が犠牲になります。 制限では、データベースを実際に保存するために必要な外部メモリの2倍が必要になる場合があります。 シャドウメカニズムは信頼性がありますが、粗すぎるツールです。 外部メモリの一貫した状態は、すべてのオブジェクトに共通のある時点で提供されます。 実際、一貫性のあるページのセットがあれば十分であり、各ページは独自の時間サンプルに対応できます。

このような弱い要件を満たすために、データベース変更操作の論理ログとともに、ページごとの変更がログに記録されます。 ソフト障害から回復するための最初のステップは、失敗した論理操作を一度に1ページずつロールバックすることです。 トランザクションに関する論理レコードで行われるように、単一の論理操作からの最後にページングされた変更レコードは、操作の終わりです。

このアプローチで問題を解決するには、2つの方法があります。 最初の方法は、論理操作とページング操作の共通ログを維持します。 当然、まったく異なる方法で解釈される2種類のレコードの存在は、ジャーナルの構造を複雑にします。 さらに、ページごとの変更の記録は、その関連性がローカルな性質のものであるため、ジャーナルが大幅に(そしてあまり意味がない)増加します。

したがって、ページ変更の個別の(短い)ジャーナルを維持することがますます一般的になっています。 この手法は、たとえば、有名な製品InformixOnlineで使用されています。

何らかの方法で、データベースの外部メモリをtpcの時点の状態に復元できたと仮定します(これを行う方法-少し後で)。 それで:

・トランザクションT1にはアクションは不要です。 tpcの前に終了し、そのすべての結果がデータベースの外部メモリに反映されます。

・トランザクションT2の場合、残りの操作を再実行する必要があります(やり直し)。 実際、外部メモリには、tpcの瞬間の後にトランザクションT2で実行された操作の痕跡はまったくありません。 したがって、T2操作の直接の再解釈は正しく、データベースの論理的に一貫した状態になります(T2トランザクションはソフト障害の前に正常に完了したため、ログにはこのトランザクションによって行われたすべての変更の記録が含まれます)。

・TKトランザクションの場合、操作の最初の部分(元に戻す)は反対方向に実行する必要があります。 実際、データベースの外部メモリには、tpcの瞬間の後に実行されたTK操作の結果が完全に存在しません。 一方、外部メモリには、tpcの前に実行されたTK操作の結果が含まれることが保証されています。 したがって、TK操作の逆の解釈は正しく、データベースの一貫した状態につながります(TKトランザクションはソフト障害の時点までに完了しなかったため、リカバリ中に、その実行のすべての結果を保持する必要があります)。

・tpcの後に開始され、ソフト障害の前に終了したT4トランザクションの場合、完全なやり直しを実行する必要があります。

最後に、tpcの瞬間の後に開始され、ソフト障害の時点までに完了する時間がなかったトランザクションT5には、アクションは必要ありません。 このトランザクションの結果は、データベースの外部メモリから完全に欠落しています。

ハードクラッシュからの回復

データベースの変更ログでは、ハード障害後にデータベースを最後の一貫した状態に復元するのに十分ではないことは明らかです。 この場合、リカバリの基本はデータベースのログとバックアップコピーです。

リカバリは、アーカイブコピーからデータベースをコピーして戻すことから始まります。 次に、完了したすべてのトランザクションに対してREDOが実行されます。つまり、操作は順方向に再実行されます。

より正確には、次のことが起こります。

・すべての操作は、ログに沿って順方向に実行されます。

・障害が発生するまでに完了していないトランザクションの場合、ロールバックが実行されます。

実際、ハード障害によってRAMバッファーが失われることはないため、障害が発生したトランザクションでも続行できるレベルにデータベースを復元することができます。 ただし、ハードクラッシュからの回復はかなり長いプロセスであるため、これは通常は実行されません。

信頼性の観点からロギングには特別な要件がありますが、原則として失われる可能性があります。 次に、データベースを復元する唯一の方法は、アーカイブコピーに戻すことです。 もちろん、この場合、データベースの最後の一貫した状態を取得することはできませんが、これは何もないよりはましです。

ここで簡単に説明する最後の問題は、データベースのバックアップの作成に関するものです。 最も簡単な方法は、ログがいっぱいになったときにデータベースをアーカイブすることです。 いわゆる「イエローゾーン」がログに導入され、そこに到達すると、新しいトランザクションの形成が一時的にブロックされます。 すべてのトランザクションが完了し、データベースが一貫性のある状態になったら、データベースをアーカイブしてから、ログの入力を再開できます。

ログがいっぱいになるよりも少ない頻度でデータベースをバックアップできます。 ログがいっぱいで、開始されたすべてのトランザクションが終了した場合は、ログ自体をアーカイブできます。 このようなアーカイブログは、基本的にデータベースのアーカイブコピーを再作成するためにのみ必要であるため、アーカイブログ情報を大幅に圧縮できます。

銀行カードを使用して商品の支払い、資金の引き出し、または送金を行うたびに、銀行のクライアントは特定のトランザクションを実行します。 また、すべてのトランザクションには数分しかかかりませんが、操作の完全なサイクルは、お金の引き出し要求の送信、処理、実行など、非常に広範なプロセスです。

トランザクションとは、銀行カードを使用した操作のことであり、その実行により、クライアントのアカウントの状態が変化します。 トランザクションは、リアルタイム(オンライン)およびオフラインで実行できます。

オンライン取引では、支払いまたは送金時に支払いの確認が義務付けられています。

オンライン取引には、カード間の送金、ATMでの現金引き出し操作、小売店や店舗での決済操作が含まれます。 ショッピングセンターで商品の支払いを行う例を使用して、オンライン取引を実行するプロセスを考えてみましょう。

操作には3つの関係者が関与します。

  • 選択した店舗にサービスを提供する取得銀行(店舗に設置されているのはPOS端末)。
  • 支払い銀行カードを提供する発行銀行。
  • 決済取引(Visa、MasterCardなど)の中間リンクである国際決済システム。

オンライン取引注文

決済取引は、ペイメントカードがレジに渡され、POS端末が支払いに必要なデータ(カード番号、有効期間、所有者名など、磁気テープで暗号化された情報)を読み取った瞬間から始まります。 読み取った情報は、POS端末にサービスを提供する取得銀行に転送されます(原則として、店舗は端末のサービスに関する特別契約を締結し、それに応じて取引ごとに手数料が請求されます)。

受信したデータは、取得銀行からカードを提供する国際決済システムのデータ処理センター(DPC)に送信されます。

データセンターは、ストップリストに支払いカードが存在するかどうかをチェックし(不正の疑いのあるカードがストップリストに表示される場合があります)、その結果、操作が承認または拒否されます。

その後、情報は発行銀行の処理センターに転送され、そこで支払いが承認されます。 ここでは、トランザクションの合法性がチェックされます。トランザクションを完了するのに十分な資金があるかどうかがチェックされ、入力されたPINコードが実際の値と一致するかどうかがチェックされます。 また、設定された操作制限を超えていないか確認します。

発行銀行の応答は、データセンターを介して取得銀行とストアに返送されます。 支払いの詳細は小切手に表示され、購入者に転送されます。

オンラインおよびオフライントランザクションの機能

オンライントランザクションを実行するときに考慮されるアクションは、バイヤーとストアの間の対話を完了します。 しかし、トランザクションプロセス自体はそれだけではありません。 実際のところ、資金はカードからすぐに引き落とされるわけではなく、一時的にブロックされます。 資金は取得銀行の口座から店舗に送金され、取得銀行が財務書類を発行者に送金して借方に記入した後にのみ、カードから引き落とされます。 これは、数日または1か月の期間にわたって発生する可能性があります。

オフライントランザクションは、別の原則に従って実行されます。 リモート側による検証アクションと承認または拒否なしで合格します。 取引は事前に承認され、銀行カードの残高が予約され、すべての支払いの詳細が決済端末のメモリに保存されます。

オフライントランザクションは、端末に蓄積された情報が通信チャネルを介してサービングバンクに送信されるときに実行されます。 通常、お支払いをお願いしてから実際にお支払いいただくまでに数日かかります。

オフライントランザクションは、処理センターとの接続をリアルタイムで確立できない場合に使用されます(飛行機、バス、タクシーなど)。

トランザクションの禁止とキャンセル

最も一般的な取引は、店舗での支払い、送金、現金の引き出しです。 取引を禁止できる理由はいくつかあります。

最も一般的なものは次のとおりです。

  • 銀行カードがブロックされました。
  • 操作を完了するために必要な銀行カードに十分な資金がありません。
  • 支払いカードは、支払いを行う際に制限を設けています。
  • 支払いカードの有効期限が切れています。
  • PINコードの入力時にエラーが発生しました。
  • 銀行カードは、マネーロンダリングや詐欺などの疑いでストップリストに含まれていました。
  • 技術的な問題があります(Webサイト、ATMなど)。

取引の禁止がカードの残高不足に関連していない場合は、サービス銀行に連絡して問題を解決する必要があります。 場合によっては、お客様ご自身の意思で取引をキャンセルすることができます(もちろん、現金の引き出しについて話していなければ)。 カードから引き落とされた資金を不正に返金できるようにするには、取引をキャンセルする可能性について知っておく必要があります。

最も簡単な方法は、実行された日にトランザクションをキャンセルすることです。

操作をキャンセルする機能は、端末自体にあります。

ターミナルからのデータがすでに銀行に転送されている場合は、金融機関自体に連絡する必要があります。