問題タブ [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.
ruby-on-rails - (安らかな) レールを使用している場合、トランザクションはいつ開始されますか?
安らかな動詞全体が単一の包括的なトランザクションの下にあるということですか? つまり、UPDATE、DELETE、または CREATE 操作の処理の任意の時点で検証またはコールバックでエラーを発生させた場合、以前のコールバックで実行した可能性のあるすべてのデータベース操作もロールバックされますか? 簡潔に言えば、コールバックまたは検証でエラーを発生させると、その動詞アクションのデータベースでまったく変更が発生しないようになりますか?
java - SpringとHibernateを使用して複数のデータベース間で分散トランザクションを行う「最良の」方法は何ですか?
ユーティリティのようなアプリケーションを隅に置き、2 つの異なるデータベースを定期的に更新しています。
これは、Spring Application Context で構築された小さなスタンドアロン アプリです。コンテキストには 2 つの Hibernate セッション ファクトリが構成されており、Spring で構成された Commons DBCP データ ソースを使用しています。
現在、トランザクション管理はありませんが、いくつか追加したいと思います。一方のデータベースの更新は、他方のデータベースの更新が成功するかどうかにかかっています。
アプリは Java EE コンテナー内に存在しません。シェル スクリプトから呼び出される静的ランチャー クラスによってブートストラップされます。ランチャ クラスはアプリケーション コンテキストをインスタンス化し、その Bean の 1 つでメソッドを呼び出します。
データベースの更新にトランザクション性を持たせる「最良の」方法は何ですか?
「最高」の定義はお任せしますが、「設定が簡単」「設定が簡単」「安価」「パッケージ化や再配布が容易」といった機能があればいいと思います。当然FOSSがいいでしょう。
java - 分散処理:JTAと同等のC++
私は、データの整合性が最重要であり、パフォーマンスがすぐ近くにあるミッションクリティカルなソリューションを開発しています。データがいっぱいになると、壊滅的な事態になります。
そこで、C / C ++バージョンのJTA(Java Transaction API)を探しています。分散トランザクションをサポートするCまたはC++ライブラリを知っている人はいますか?そして、はい、私はそれをグーグルで検索しました...失敗しました。
存在しないと言われたくないので、 Distributed TP:XA仕様で指定されたプロトコルを実装する必要があります。
助けてください!
編集(kervinに対応):複数のデータベースサーバーにレコードを挿入する必要があり、それらをアトミックにコミットする必要がある場合、Oracleなどの製品にはそのソリューションがあります。独自のメッセージキューサーバーを作成し、メッセージを複数のサーバーにアトミックにコミットしたい場合は、トランザクションのアトミック性を詰め込まないようにするために、JTAのようなものが必要になります。
.net - リモート MSMQ をトランザクションで使用するにはどうすればよいですか?
MSMQ からメッセージを取得してレガシー システム (Baan) にポストする Windows サービスを作成しています。投稿が失敗したり、投稿中にマシンがダウンしたりしても、メッセージを失いたくありません。したがって、MSMQ トランザクションを使用しています。失敗すると中止し、成功するとコミットします。
ローカル キューに対して作業する場合、このコードはうまく機能します。しかし、本番環境では、サービスを実行しているマシン (または複数のマシン) をキュー自体から分離したいと考えています。リモート キューに対してテストすると、「トランザクションの使用法が無効です」という System.Messaging.MessageQueueException がスローされます。
問題のキューがトランザクション対応であることを確認しました。
キューから受信するコードは次のとおりです。
答え
それ以来、私はSQL Service Brokerに切り替えました。リモート トランザクション受信をサポートしていますが、MSMQ 3.0 はサポートしていません。さらに、おまけとして、クラスター化してバックアップした SQL Server インスタンスを既に使用しています。
transactions - SQL Server 2000 および System.Transactions.TransactionScope()
SQL2000 で TransactionScope() を使用して LIGHTWEIGHT トランザクションを作成することは可能ですか? または、そうでない場合、CommitableTransaction および/または同様のものを使用した回避策はありますか?
したがって、基本的には、「SQL2000 でローカルから 1 サーバーへのトランザクションが必要な場合は、TransactionScope() を使用しないでください」というのが答えです。
sql - トランザクション分離の問題または間違ったアプローチ?
私は同僚の SQL の問題を手伝っていました。主に、すべての行をテーブル A からテーブル B (両方のテーブルが同じ列 (名前と型) を持つ) に移動したいと考えていました。これは Oracle 11g で行われましたが、あまり重要ではないと思います。
彼らの最初の素朴な実装は次のようなものでした
彼らの懸念は、AからBへのコピー中にテーブルAにINSERTが行われ、「DELETE FROM A」(または価値がある場合はTRUNCATE)によってデータが失われる(Aに新しく挿入された行が削除される)ことでした。
もちろん、コピーした行の ID を一時テーブルに格納してから、一時テーブルの IDS に一致する A の行だけを削除することをすぐに推奨しました。
ただし、好奇心のために、INSERT と DELETE の間に待機コマンド (PL/SQL 構文を覚えていないでください) を追加して、ちょっとしたテストを行いました。次に、別の接続からDURING THE WAITに行を挿入します。
そうすることで、それがデータの損失であることがわかりました。SQL Server でコンテキスト全体を再現し、すべてをトランザクションにラップしましたが、それでも SQL Server で新しいデータが失われました。これにより、最初のアプローチに体系的なエラー/欠陥があると思いました。
ただし、TRANSACTION が新しい INSERT から (どういうわけか?) 分離されていなかったという事実なのか、それとも WAIT コマンド中に INSERT が発生したという事実なのかはわかりません。
結局、私が提案した一時テーブルを使用して実装しましたが、「なぜデータが失われたのか」という答えを得ることができませんでした。なぜなのかご存知ですか?
sql - マルチプロセス書き込みのトランザクションカプセル化
複数のプロセスがテーブルに挿入し、単一のプロセスがそこから選択するデータベース シナリオ (私は Oracle を使用しています) があります。テーブルは基本的に中間ストレージとして使用され、複数のプロセス (以下ではライターと呼ばれます) がログ イベントを書き込み、そこから単一のプロセス (以下ではリーダーと呼ばれます) がさらに処理するためにイベントを読み取ります。リーダーは、テーブルに挿入されたすべてのイベントを読み取る必要があります。
現在、これは、挿入された各レコードに昇順の ID が割り当てられることによって行われます。リーダーは、以前に読み取ったブロックの最大 ID よりも ID が大きいエントリのブロックをテーブルから定期的に選択します。例:
このアプローチの問題は、ライターが同時に動作するため、行が昇順で割り当てられている場合でも、割り当てられた ID に従って行が常に順番に挿入されるとは限らないことです。つまり、id=100 の行は、id=110 のレコードの後に書き込まれることがあります。これは、id=110 の行を書き込むプロセスが、レコード id=100 を書き込むプロセスの後に開始されたが、最初にコミットされたためです。これにより、リーダーが id=110 の行を既に読み取った場合、id=100 の行が失われる可能性があります。
ライターにテーブルの排他ロックを強制すると、ライターが順次挿入し、リーダーが未処理のコミットを待機するようになるため、問題が解決します。ただし、これはおそらくそれほど高速ではありません。
私の考えでは、Reader は、未解決の Writer コミットを待ってから読み取るだけで十分です。つまり、すべてのライターが終了するまで、リーダーが読み取りを行っている限り、ライターは同時に動作し続ける可能性があります。
私の質問は次のとおり
です。ライター プロセスの未処理のコミットを待機するようにリーダー プロセスに指示するにはどうすればよいですか? 上記の問題に対する代替案も歓迎します。
windows - DTCPingとDTCTesterの違いは何ですか?
以前、MSDTCの問題を診断するためにDTCTesterを使用しました。しかし、DTCPingがほぼ同じことをしているように見えることに気づきました。これら2つの違いは何ですか?
これまでのところ、DTCPingはクライアントマシンとサーバーマシンの両方で実行する必要がありますが、DTCTesterはクライアントからのみ実行する必要があります。他に違いはありますか?
database - Sybase データベースを分散トランザクションに登録できないというエラーを修正するにはどうすればよいですか?
私は、Sybase のセットアップについてほとんど (おそらく何も) 知りませんが、SSIS が Sybase を分散トランザクションに登録する際に問題を抱えていることは知っています。誰もこれを機能させることができましたか?
これは、パッケージの TransactionOption を Required に変更したときに発生します。デフォルトの「サポート」に戻すと、パッケージはエラーなしで実行されます (ただし、スレッドセーフではありません)。
transactions - 順次操作を実行するためのベスト プラクティス
いくつかのタスクを一緒に実行する最善の方法は何ですか?1 つのタスクが失敗した場合、次のタスクは完了できませんか? それがデータベース操作であった場合、トランザクションを使用する必要があったことはわかっていますが、次のようなさまざまな種類の操作について話しています。
すべてのタスクに合格する必要があります。
SendEmail ArchiveReportsInDatabase CreateAFile
上記のシナリオでは、すべてのタスクがパスするか、バッチ操作全体がロールバックされる必要があります。