問題タブ [distributed-transactions]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - transactionscope の使用時にトランザクションが分散にエスカレートするのを停止するための推奨される方法
TransactionScope オブジェクトを使用して、関数呼び出し間で渡す必要のない暗黙的なトランザクションをセットアップするのは素晴らしいことです。ただし、別の接続が既に開いているときに別の接続が開かれた場合、トランザクション コーディネーターは分散するトランザクションを静かにエスカレートします (MSDTC サービスを実行する必要があり、より多くのリソースと時間を消費します)。
したがって、これで問題ありません。
しかし、これはトランザクションをエスカレートします:
ネストされた接続を使用しながら、この方法でトランザクションのエスカレーションを回避するための推奨される方法はありますか?
現時点で思いつく最善の方法は、次のように、ThreadStatic 接続を確立し、Transaction.Current が設定されている場合にそれを再利用することです。
編集:したがって、上記のコードのように、トランザクションスコープ内にネストされているときに同じ接続を再利用することが答えである場合、トランザクション中にこの接続を破棄することの影響について疑問に思います。
私が見る限り(リフレクターを使用してコードを調べる)、接続の設定(接続文字列など)がリセットされ、接続が閉じられます。したがって (理論的には)、接続文字列を再設定し、後続の呼び出しで接続を開くと、接続が「再利用」され、エスカレーションが防止されます (私の最初のテストではこれに同意しています)。
それは少しハックに思えます...そして、オブジェクトが破棄された後はオブジェクトを使い続けるべきではないと述べているベストプラクティスがどこかにあるに違いありません!
ただし、シールされた SqlConnection をサブクラス化することはできず、トランザクションに依存しない接続プールに適したメソッドを維持したいので、より良い方法を見つけるのに苦労しています (しかし喜んでいます)。
また、アプリケーションコードがネストされた接続を開こうとした場合に例外をスローすることで、ネストされていない接続を強制できることに気付きました (ほとんどの場合、コードベースでは不要です)。
ハックの少ないソリューションを引き続き評価します:)
database - 「分散トランザクション」とは何ですか?
分散トランザクションに関するウィキペディアの記事はあまり役に立ちません。
分散トランザクションとは何かについて、より詳細な概要を説明していただけますか?
また、ネットワークに接続された 2 台以上のコンピューターでデータを更新するトランザクションをアプリケーションまたはデータベースが実行する必要がある理由の例を教えてください。
古典的な銀行の例を理解しています。私は、Dynamo、Bigtable、HBase、Cassandra などの Web スケール データベースでの分散トランザクションに関心があります。
nhibernate - NHibernate - 分散トランザクションと独自の接続を提供すると例外が発生する
NHibernate は、分散トランザクションに参加し、独自の接続オブジェクトを指定してセッションを開いたときに例外をスローします。
次のコードは問題を再現します。現在の FluentNibernate と NHibernate 2.1.2.4000 を参照してください。
.net - .net 分散トランザクションを検出
私のアプリケーションでは、DB を呼び出すために次のパターンを使用します。
問題は、操作 1 と操作 2 が 90% の時間で同じデータベースを使用することですが、2 つの DB を使用する場合 (バグ) があります。トランザクションが分散された場合に例外を取得したい。
トランザクションが分散トランザクションに昇格したかどうかを検出するにはどうすればよいですか?
ありがとう、ラドゥ
oracle - ODAC を使用する Oracle のトランザクションに 2 つの接続が登録されている場合、分散トランザクションを使用したコミットと選択の間の遅延/ラグ
2 つの接続を使用して 2 つの Oracle データベースを呼び出すアプリケーションがあります (これらはアプリケーション全体で開かれています)。特定の機能については、分散トランザクションを使用します。接続文字列に Enlist=false を指定し、トランザクションへの接続を手動で登録します。問題は、分散トランザクション内で同じレコードを非常に頻繁に更新するシナリオで発生し、前回の実行でコミットされたデータを表示するのに遅延が見られます。
元。
上記のコード フラグメントのように、次の繰り返しで以前に更新された値を更新してチェックします。単一のレコードに対してこれを頻繁に実行すると、前の反復でコミットされたにもかかわらず、次の反復の最後の反復でコミットされた更新が表示されない場合に問題が発生します。しかし、これが発生すると、この更新は非常にわずかな遅延で他のアプリケーションに表示され、コード内でさえ、行をデバッグして再度実行すると表示されます。前のコミットがコードから返されたとしても、コミットの遅延のようなものです。誰にもアイデアはありますか?
.net - ServicedComponentでトランザクションの中止を検出する方法は?
分散トランザクションに参加するために、System.EnterpriseServices.ServicedComponentを作成しようとしています。私の主な方法は次のようになります。
私がやろうとしているのは、分散トランザクションが中止されたか(またはロールバックされたか)を検出してから、変更のロールバックにも進むことです。たとえば、ディスク上にファイルを作成したり、元に戻す必要のあるいくつかの副作用を実行したりした可能性があります。
SystemTransaction.TransactionCompletedイベントを処理しようとしたか、Dispose()メソッドでSystemTransactionの状態を調べましたが成功しませんでした。
これは「取引」ではなく「補償」に似ていると理解しています。
私がやろうとしていることは意味がありますか?
java - Springを使用して、あるEARファイルから別のEARファイルへトランザクション的に安全に呼び出す「正しい」方法は何ですか?
2 つの Spring アプリケーション A と B があり、それぞれが個別の EAR ファイル内にあります。今、私は A から B に、またはその逆に、おそらく A -> B -> A またはそれ以上に呼び出したいと思っています。
呼び出しはトランザクション的に安全でなければなりません。
推奨されるアプローチは何ですか?
algorithm - 銀行取引は「フードの下」でどのように機能しますか - おそらく詳細
銀行取引がどのように機能するのか疑問に思っています。少なくとも受け入れられる説明を見つけるのは非常に困難です。それほど深刻なビジネスではない、いくつかの基本的な分散トランザクション アルゴリズムを意味するものではありません。
では、一貫性を保ち、1 セントたりとも失うことがないようにするために、銀行はどのような手段を講じなければならないのでしょうか。
国際取引、銀行間の取引はどうでしょうか。
全世界でのデータの一貫性 - ニューヨークですべてのお金を引き出し、東京でもう一度繰り返すのではなく..
そして、最近の歴史を通じて記録された壮大な失敗はありますか?
私はすべての答えにとても感謝しています。
sql - Oracle global_names DELETE の問題
データベース リンクを使用して別の DB で DELETE ステートメントを実行していますが、DB リンク名はグローバルな命名に準拠しておらず、この要件は変更できません。また、global_names を false に設定しており、どちらも変更できません。
ただし、これらのリンクを使用しようとすると、次のメッセージが表示されます。
設定できない場合の代替アクションglobal_names=trueは?
乾杯、
ジャン
msmq - MaxConcurrentListeners と MSMQ からのリモート トランザクション読み取り
DistributedTxMessageListenerContainer の MaxConcurrentListeners はあまり役に立たないのでしょうか? 一度に 1 つのスレッドしかキューからのメッセージを処理できないという印象があります。トランザクションが成功した場合にのみメッセージがキューから削除されるため、おそらくそれは論理的です。それとも私はここで間違っていますか?