SOAPスキーマがどのようにトランザクションを分散しますか?

 まず、トランザクション(取引)が何であるか
  
  活性に関与するメカニズムを提供する不可分トランザクション実行ユニットに組み込まれたすべての操作、業務からなるすべての操作のみ全ての通常の動作の場合にのみ送信することができる限り、行うことができますどちらかの操作が失敗し、それは、トランザクション全体のロールバックにつながります。簡単に言えば、トランザクションは「何もしない、または(オールオアナッシング)フルを行うのどちらか」のメカニズムを提供します。:トランザクションの4つのACIDプロパティは、その頭文字によれば、我々は、一般的に、トランザクションと呼ばれる、4つのプロパティを持つ
  
  アトミック(原子性):「原子」という用語の本来の意味は、不可分な意味、アトミックトランザクションの意味でありますである:トランザクションのすべての操作は、すべての操作は、すべてまたはnone実行いずれかを実行し、全体としてバンドルされ、
  
  一貫性(整合性):アトミックトランザクションは、トランザクションが成功した場合、トランザクションは、リング一貫性のあるデータを破壊しないことを保証提出、ステータスデータは、データ状態と一致するように、組織化前の取引に応じて実行されるすべての操作の結果で構成され、任意のトランザクションの場合にエラー中間ステップは、全体のトランザクションがロールバックされ、元の状態にデータを戻す、データ状態が残っ一貫性。従って、一つの一貫性のある状態から別の一貫した状態の状態にのみ、トランザクションデータ、
  
  分離(単離):トランザクションの外部からの眺めは、トランザクションは、二つのデータ・コヒーレンシ状態との間の一貫性を達成します変換が、トランザクション内からの眺め、個々の操作からなるトランザクションは、論理的な順序で実行され、2つのコヒーレンシ状態にあるデータ「中間状態」。しかしながら、この中間状態は、トランザクションの内部から隔離され、外部のトランザクションが表示されていない、
  
  永続的な(耐久性):永続性が持続する(データベースなど)永続的なデータ・リソースに基づいて、一度正常に送信手段、データへの変更は永続的です。
  
  トランザクションが最初にデータベース管理システム(DBMS)に由来し、それはデータベースに格納された運転データを反映しています。トランザクションのサポートを提供するために、操作のトランザクション・ベースのデータ・モードはまた、MSMQなどの他のデータ・ストレージ・リソースに適用することができるようにSQL ServerやOracleやDB2などの主流のリレーショナルデータベース管理システムに加えて、。(トランザクショナルリソース)カテゴリのトランザクション・リソースが含まれてWindows Vistaのファイルシステム(NTFS)レジストリの初めから。
  
  第二に、明示的な事務の管理
  
  、トランザクション・リソースが、より多くの家族が、私たちのデータベースは最も頻繁に使用されるトランザクションリソースであることは否めません。少しいくつかの経験を持つ開発者にとって、あなたは過トランザクションベースのSQLストアドプロシージャ(ストアドプロシージャ)を書き、またはADO.NETベースのトランザクション、ここでの開始から取引の更なる情報にコードを記述する必要があります。
  
  1、中のSQLトランザクション処理
  
  の両方SQL ServerベースのT-SQL、または両方のトランザクションがネイティブサポートはT自体でT-SQLトランザクションを参照することは興味深い提供するOracleのPL-SQLに基づいています(トランザクション)。T-SQLを使用すると、例えば、我々は、トランザクション、提出とロールバックを開始した3つのSQL文を以下により達成することができます:
  
  TRANSACTION BEGIN:トランザクションの開始を、
  
  トランザクションをコミット:TRANSACTIONをBEGINとCOMMITすべての位置TRANSACTIONの間で運転を提出し、
  
  ROLLBACK TRANSACTIONを:トランザクションを開始し、トランザクションをコミットの間に位置するすべての操作をロールバックします。
  
  私たちは、トランザクション操作に基づいて非常に典型的な例を与える:銀行振込、この例では、常にこの章を介して実行されます。この目的のために、我々は最初のアカウントのデータシートを保存するために最も簡単なの一つを作成します。T_ACCOUNTは、ほぼテーブル全体が唯一のID、名前や銀行口座の残高を表す3つのフィールド(ID、NAMEおよびバランス)を、含まれています。次のようにテーブルT-SQLを作成する
  
  。1:CREATE TABLEを[DBO] [T_ACCOUNT](。
  
  2:[ID] VARCHAR(50)PRIMARY KEY、
  
  3:[NAME] NVARCHAR(50)NOT NULL、
  
  4:[BALANCE] NOT NULL FLOAT)
  
  5:GO
  
  銀行移動錯体は、簡単な操作では、2つの基本的な操作からなる:ストレージおよび検索、即ち、別のアカウントへのアクセス、1つのアカウントから適切な量を抽出します。データの整合性の要件は、私たちは、同じ1つのトランザクションにこれらの2つの操作を持っているということです。我々は、ストアドプロシージャによって転送処理を完了した場合、特定のSQLは、以下の文言を使用する必要があります
  
  。1:P_TRANSFER手順CREATE
  
  2:(
  
  3:@fromAccount VARCHAR(50)、
  
  4:@toAccount VARCHAR(50)、
  
  5: FLOATの@amount
  
  6 :)。
  
  7:AS。
  
  8:
  
  9: -アカウントの存在を確実
  
  10:NOTが存在する場合(SELECT * [DBO] [T_ACCOUNT] WHERE ID = @fromAccount FROM)。
  
  11:BEGIN
  
  ( 'AccountNotExists'、16,1)RAISERROR:12
  
  13:RETURN
  
  14:END
  
  15:NOTが存在する場合(SELECT * [DBO]の[T_ACCOUNT] ID = @toAccount。)
  
  16:BEGIN
  
  (RAISERROR:17 'AccountNotExists'、16,1)
  
  18:RETURN
  
  19:END
  
  20: -确保余额充足性
  
  21:NOTが存在する場合([T_ACCOUNT] WHERE ID = @fromAccount AND BALANCE> = @amount [DBO] SELECT * FROM)。
  
  22:BEGIN
  
  23:RAISERROR( 'LackofBalance'、16,1)を
  
  24:RETURN
  
  25:END
  
  26: -转帐
  
  27:BEGIN TRANSACTION
  
  。28:UPDATE [DBO] [T_ACCOUNT]のSET BALANCE = BALANCE - @amount WHERE ID = @fromAccount
  
  29:@@ ERRORは、<> 0の場合
  
  30:BEGIN
  
  31:ROLLBACK TRANSACTIONを
  
  32:END
  
  33 :. UPDATEある[DBO]は[T_ACCOUNT] = SET +バランスがWHERE ID = @toAccount @amount BALANCE
  
  34は:IF @@ ERROR <> 0
  
  35:BEGIN
  
  トランザクションのロールバック:36
  
  37を:END
  
  38は:TRANSACTION COMMIT
  
  39: GO
  
  2、ADO.NETのトランザクション制御
  
  の両方のT-SQL、またはPL-SQL、データベース管理システム、又はそれがSQL標準の拡張機能では、だけでなく、標準ベースのSQL DDL(データ定義言語)とDML(データ操作を提供するため言語)も機能、ストアドプロシージャとプロセス制御のためのサポートを提供します。開発者は関数やストアドプロシージャを作成するために、任意の.NET言語を使用できるようにSQL Serverの2005年以来、でも、CLR(共通言語ランタイム)との統合を可能にします。あなたは、SQLを使用して、任意のビジネスロジックを実装することができますと言っても過言ではありません。
  
  しかし、我々はこれをしないほとんどのケースでは、我々はより多くのまたはSQL使用されている最も基本的なデータ操作言語のようになります。.NET開発者のために、我々はまだ複雑なロジックを使用し、そのようなC#として、またはVB.NETを介してオブジェクト指向プログラミングで書かれたプログラムで実行される制御フロー。その理由は、私は2つの点があると思います。
  
  オブジェクト指向言語では、より簡単に複雑なロジックを実装している:我々はオブジェクト指向の方法により、ヒト特有の論理シミュレーションに近い、現実の世界に近い、レコード、オブジェクト指向言語のコレクションよりもこのSQLベースの言語を考え方。また、言語自体の特徴の相対数が表面化、我々は様々なデザインパターンやアイデアをより簡単に適用できます。
  
  あまりにも多くの拡張機能の適用を助長されていませんデータベースに論理演算を実行します:部下の観点から、データ操作を典型的な分散Webアプリケーションに特定のサーバへの計算負荷は、例えば、Webサーバ(Webアプリケーションベアラ)、アプリケーションサーバ(ベアラ・サービス)とデータベースサーバは論理ベアラの最終的な動作とすることができます。しかし、スケーラビリティ(またはスケーラブル)の観点から、データベースよりも主計算上の利点に最初の二つ。私たちの集中操作は、Webサーバやアプリケーションサーバに移行する(そのような動作は、より多くのCPU時間とメモリを必要とする)場合は、サーバーファームは、上記複数のサーバに分割する(バランスをロードする)ことができる負荷分散することができます動的負荷に応じて構成されています。しかし、データベース・サーバは、サポートを負荷分散するのは簡単ではありません。
  
  このため、SQLの実装を使用した場合に比べ、トランザクションを制御するために、我々はほとんど、または途中に基づいて、オブジェクト指向プログラミング言語の使用使用しています。.NET開発者のために、私たちは直接、同じトランザクション内の単一のデータベース接続に複数の操作に基づいて、ADO.NETを使用することができます。同様に全体の時間、例えば、上記の銀行振込取引に我々はサービス(BankingService)動作(転送)として転送します。かかわらず、全体ADO.NETバンク転送動作データベース・プログラミング・モデルの特定のタイプの次のコードは、最終的な転送は、ストアドプロシージャを呼び出すことにより行われる:
  
  1:パブリッククラスBankingService:IBankingService
  
  2:{
  
  3://他の操作
  
  4:公共ボイド転送(文字列fromAccountId、文字列toAccountId、二量)
  
  5:{
  
  6:文字列のconnectionStringName = "BankingDb"。
  
  7:文字列れたconnectionString = ConfigurationManager.ConnectionStrings【のconnectionStringName] .ConnectionString。
  
  8:文字列providerNameで= ConfigurationManager.ConnectionStrings【のconnectionStringName] .ProviderName。
  
  9:DbProviderFactory dbProviderFactory = DbProviderFactories.GetFactory(providerNameで)。
  
  10:使用した(たDbConnection接続= dbProviderFactory.CreateConnection())
  
  11:{
  
  12:connection.ConnectionString =れたconnectionString。
  
  13:たDbCommandコマンド= connection.CreateCommand()。
  
  14:command.CommandText = "P_TRANSFER"。
  
  15:command.CommandType = CommandType.StoredProcedure。
  
  16:
  
  17:のDbParameterパラメータ= dbProviderFactory.CreateParameter()。
  
  18:parameter.ParameterName = BuildParameterName( "fromAccount")。
  
  19:parameter.Value = fromAccountId。
  
  20:command.Parameters.Add(パラメータ)。
  
  21:
  
  22:パラメータ= dbProviderFactory.CreateParameter()。
  
  23:parameter.ParameterName =のhttp://zzdxjyzd.comBuildParameterName( "toAccount");
  
  24:parameter.Value = toAccountId。
  
  25:command.Parameters.Add(パラメータ)。
  
  26:
  
  27:パラメータ= dbProviderFactory.CreateParameter()。
  
  28:parameter.ParameterName = BuildParameterName( "量")。
  
  29:parameter.Value =量。
  
  30:command.Parameters.Add(パラメータ)。
  
  31:
  
  32:connection.Open();
  
  33:使用した(DbTransactionトランザクション= connection.BeginTransaction())
  
  34:{
  
  35:command.Transaction =トランザクション。
  
  36:試みる
  
  37:{
  
  38:command.ExecuteNonQuery();
  
  39:transaction.Commit();
  
  40:}
  
  41:キャッチ
  
  42:{
  
  43:transaction.Rollback();
  
  44:投げます。
  
  45:}
  
  46:}
  
  47:}
  
  48:}
  
  49:}
  
  注:上記のコードを作るためには、同時に、OracleやSQL Serverなどのデータベースの異なる種類の、のために使用することができ、私は名前、それによって対応するDbProviderFactory作成されたオブジェクトを抽出することにより、文字列構成データベース・プロバイダーを(DBPROVIDERカバー)を接続します。たDbConnection、たDbCommand、のDbParameterとDbTransactionを含むすべてのADO.NETオブジェクトは、DbProviderFactoryによって作成され、それが特定のデータベース・タイプに関連付けられていません。また、別のに基づいて、データベースのストアドプロシージャの異なる種類の名前付きパラメータは、SQL Serverなどのパラメータは、「@」プレフィックスを追加します、と私は、単一の方法(BuildParameterName)で達成パラメータの名前を解決します。
  
  図3に示すように、制御トランザクションを明示的リソースへの単一のアクセスで定義され
  
  た制御データADO.NETに基づいている場合、SQLでトランザクションを制御することで、SQL文の動作の期間に基づいて、単一のトランザクションに組み込むことができますそれは、データベース接続に限定されるものと同じトランザクション・オペレーションに組み込まれます。換言すれば、上述した両方の明示的な制御トランザクションは、単一のローカルリソースの制御に限定されています。
  
  私たちは、取引のような単一のサービス操作になります場合は、上記の方法明示的なトランザクション制御は、その後、サービス全体の操作は、単一のトランザクション・リソースを必要とすることができれば我々は、トランザクションサービスの概念を紹介します。関係は、図1に示すように、リソースにアクセスするためのサービス。
  
  SOAPアーキテクチャ、どのように分散トランザクションを実現するために?
  
  単一のローカルトランザクション制御リソースについては、図1
  
  の分散SOAに基づいてローカル総務として知られている単一のトランザクションのローカルリソースへのこのようなサービス・ベースのアクセス、(ローカルトランザクション)、上記アプリケーション環境は、我々はより多くのリソース、より多くのサービスを分散トランザクション統一コラボレーション(分散トランザクション)にできるようにする必要があります。次に、我々は、分散トランザクションのシナリオのいくつかの代表的なアプリケーションを紹介します。
  
  第三に、分散トランザクション(分散トランザクション)シナリオ
  
  分散トランザクション(分散トランザクション)懸念されるためには、参加者の総務は、ネットワーク環境の異なるノードを配布しました。言い換えれば、我々は1つのトランザクションに複数のトランザクションリソースを組み込むことができ、そのようなトランザクションリソースが別のマシンに配布することができます。機械を運ぶこれらの分散リソースが同じネットワークの外であってもよく、それは別のネットワークであってもよいです。でも、トランザクションのリソースにHTTPアクセスを経由して、基本的にシンプルなインターネットリソースである、と述べました。
  
  分散トランザクションのビューの立ちSOA点は、サービス操作は、サービスが単一のトランザクションとして処理されることを意味します。サービス操作は、それが別のサービスを呼び出すことができます(たとえば、二つの異なるデータベースサーバへのアクセスなど)複数のトランザクションリソースを訪問するかもしれません。ここでは代表的な三つのシナリオが起動するのが最も簡単で始まる、トランザクションを分散しています。
  
  1は、同じトランザクションに複数のリソースにアクセスする必要があります
  
  分散トランザクション最も単純なシナリオ、すなわちサービス運用上、別のサービスを呼び出すが、サービスの操作は、複数のトランザクションリソースへのアクセスを必要としません。このような2つのSQL Serverなどのデータベースサービスの操作、およびSQL ServerまたはOracleサーバーにアクセスするときに、異なるサーバと、サービス操作同じデータベースにアクセスするときが、対応するデータベースへのアクセスに基づいて、異なるデータ接続;場合サービス処理操作は、データベースのリソースにアクセスするには、トランザクションは、データベースの他の部分からのリソースへのアクセスを必要とする、私たちは、取引の参加者のすべてに協力して分散トランザクションを使用する必要があります。図2は、分散アプリケーションのシナリオを反映しています。
  
  どのように分散トランザクションSOAPスキーマ?
  
  複数のトランザクションリソースへの2回のサービスアクセス
  
  2は、同じトランザクションに含まれる各種サービスの呼び出し
  
  分散アプリケーションのシナリオでは、サービス操作が複数のトランザクションリソースにアクセスしますが、前述したが、すべての後に、単一の内部サービスで、トランザクション全体またはコントロール。サービス操作は、別のサービスを呼び出すために必要がある場合、これは複数のトランザクションを務めわたっています。この場合、サービスへの別の呼び出しでのサービス事業を開始し、他のサービスへの転送のためのいくつかのメカニズムであることが必要、サービスのリソースへのアクセスを自動的に参加呼び出されます。図3は、複数のサービス間で、このような分散トランザクションを反映しています。
  
  ?複数のサービス間で3件の取引が図どのように分散トランザクションを実現するためにSOAPアーキテクチャ、
  
  3は、1つのトランザクションにリソースやサービスへのより多くのアクセスがあります
  
  上記の2つのシナリオは、(サービスが複数のトランザクションリソースを呼び出すことができる場合には、図に示すように延びている、一緒に)他のサービスを呼び出すことができ、全体のトランザクション参加者は、ツリートポロジを形成することになる。4。サービスベースの分散トランザクションへの呼び出しでは、イニシエータとトランザクションをコミットする全て同じであった、それはクライアントコール全体であってもよいし、また、最初の呼び出しというサービスのクライアントにすることができます。
  
  分散トランザクションを達成するためにどのようにSOAPアーキテクチャ、?4 SOAベースの分散トランザクショントポロジ
  
  ローカルトランザクションの実装メカニズム、はるかに複雑よりも、単一のリソースへのアクセスに基づいて分散トランザクション。Windowsベースのプラットフォームは、私がどのように動作するようになり、次の記事でDTC分散トランザクションのインフラストラクチャを提供する場合、分散トランザクションの詳細についてアーキテクチャモデル。

おすすめ

転載: www.cnblogs.com/dakunqq/p/11360585.html