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