2012-05-10 3 views
0

現在のフォームで直接DBトランザクションを使用して複数の構成可能コンポーネントの新しい構成を一貫した方法で送信する構成GUIがあるとします。GUIをSOAP/WS-APIの更新/書き込み呼び出しから切り離す良い方法はありますか?

次に、SOAP/WS APIの背後にあるデータ(DB)を移動しましょう。 GUIにはもうDBに直接アクセスできません。トランザクションの振る舞いは維持する必要がありますが、APIはでなければなりません。は、GUIフォームの提出を明示的に受け入れるように設計する必要があります。実際、私は新しいGUIがどのように機能するのか、ユーザーの入力がどのように構造化されるのかは分からない。したがって、私はAPIサーバー側にWS-AtomicTransactionのようなものを提供する必要があります。しかし、少なくとも2つの注意点があります。

    GUIはPHPで書かれています。私はPHPでWS-Transactionのサポートはありません。
  • 追加のクライアント要求を待っている間に、サーバー側でDBトランザクションを開いたままにしたくありません。 Camel's aggregationを使用して

    • :私は考えることができる

    ソリューション。しかし、これは少なくとも2つの点でより複雑になります。

    • 同じトランザクション内の後続の呼び出しで、新しく挿入された行のDB行IDを使用することはできません。集約されたメッセージを処理する際には、クライアントとサーバーの間に通信がないため、ある種のシンボリックバックリファレンスを使用する必要があります。
    • コール応答は即時ではありません(または、各単一呼び出しに対する即時の応答と別の応答はスタブの一種、つまり「メッセージがTX xyzに添付されている」以外の有用な情報を含んでいません)ifこれはCamelの集計の場合すべて可能です)。
  • 以前の解決策の2つの欠点は、おそらくWS標準が、バッチトランザクション内の後続の呼び出しで呼び出し結果を参照する手段を提供する要求バッチを考えることになります。そのようなことはすでにありますか?たぶんPHPクライアントとして?
  • 注意:行レベルのロックなどを注意深く使用してデータベースのロック競合を解消しようとします。しかし、新しい要素を挿入するときは、通常、ページとインデックスページをDBでロックする必要があります。
  • おそらく楽観的なロックを使用していくつかのサーバー側の永続化レイヤー?しかし、DB書き込みがコミットまで延期された場合(最終的なコミット前にクライアントに戻されるDB IDは返されません)

何をYOUとお考えですか?

答えて

0

トランザクションは強力なツールであり、われわれはこの問題をすべての大きな問題を巨大なハンマーで撃たれたと見なしています。私は自分で経験したので、私はあなたの混乱に関連することができます。残念なことに、トランザクションに関しては考えずに、アトミックなAPIコールを考えるよりも、あなたには良いアドバイスはありません。

私は取引の観点から考える、私の思考パターンは、通常はこのように書きます:

  • 開始トランザクション
  • 読み取りが(必要に応じ繰り返す)
  • がコミット
  • 更新を(必要に応じ繰り返します) /ロールバック

このパターンを過度に使用していることを認識するまでには時間がかかります。実際の紛争はまれであり、それに対処する他の多くの方法があります。ここでは、更新データは、(クライアント上)のAPI

  • 読み取りで一般的に使用されるものであり、クライアント(アトミックAPI呼び出し)にデータを送信
  • (バックサーバーへのアトミックAPI呼び出しを元+アップデートを送信サーバー上の)
    • 開始トランザクション()
    • 同じ、リターンエラー(CLない場合
    • は、クライアント
    • からオリジナルとの比較読みますientが同じならば、)
    • を再試行してください
    • は最後の6点

をコミット更新する必要がありますAPI呼び出しの実装の一部です。

フェレンツ・ミハーイ http://theamiableapi.com

+0

あなたはそこにポイントを持っています。しかし、あなたは、 "APIは、GUIフォームの提出を明示的に収容するように設計すべきではありません"という要件を欠いています。これは、複数の任意の更新が組み合わせ可能でなければならないことを意味します... – user1050755

関連する問題