問題タブ [transactionscope]
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.
sql-server - データベースの1つが読み取り専用の場合、分散トランザクションのエスカレーションは発生しますか?
ソースデータベースから宛先データベースへのインポートプロセスを実行しています。これらのインポートを自動化された方法で頻繁に実行する必要があります。
ソースは宛先とは別のサーバーにあります。どちらもMSSQL2008です。Linq2SQLを使用してソースにアクセスし、カスタムデータレイヤーを使用して宛先にアクセスします。ソースDBを変更することはありません(ただし、現時点では読み取り専用として復元していません)。ただし、現在、transactionScope内でインポートを実行すると、別々のサーバー上の2つのDBにアクセスするため、トランザクション全体がDTCにプロモートされます。
ソースDBを読み取り専用にした場合でも、これは実行されますか?
このシナリオでDTCプロモーションを回避する方法に関する他の提案はありますか?
Remusの回答に対するフォローアップの質問(ありがとう):
フォローアップ#1:私のインポートルーチンは、ソースからレコードをインポートし、宛先に新しいレコードを作成するように構成されています。このような:
TransactionScopeのLinq2SqlビットをRequiresNewで囲むと言っていますか?または、私はソースでのトランザクションを本当に気にしないので、トランザクションにその接続が含まれるようにSuppressを使用してTransactionScopeで囲むことができますよね?
フォローアップ#2:
「同じデータベースに対しても、2番目の接続を開く」と言うと、これに関するいくつかのバリエーションを読みました。
- "second connection" ==まったく同じ接続文字列であっても、Connectionオブジェクトの2番目のインスタンス
- "2番目の接続"==別のResourceManagerへの接続およびSQL2005で、これ以前は上記の1と同じ意味ですが、SQL2008では、これは別のインスタンスを意味します(つまり、同じインスタンス上の2つのDBは昇格されません)
c# - nhibernate でのアンビエント トランザクションのサポートがありませんか?
NHibernate がアンビエント トランザクションをサポートしていることは知っています。これは、NHibernate セッションがトランザクション スコープ内にある間、アンビエント トランザクションに参加するためです。ただし、いくつかの奇妙な点があります。次のテストを検討してください。
このテストは失敗します。アンビエント トランザクションがデータベースに永続化されないことを NHibernate はどのように保証しますか?
entity-framework - トランザクション スコープ内で Entity Framework からストアド プロシージャを呼び出すことはできませんか?
Entity Framework を使用して、さまざまなエンティティでいくつかの変更/挿入を行うメソッドがあり、これらすべてが単一のトランザクション スコープ内にあります。これらの変更は非常にうまく機能します。
私の問題は、これらの操作の途中でストアド プロシージャを使用する必要が生じたときに始まりました。このプロシージャは、1 つのテーブルへの挿入のみを行い、トランザクションの明示的な宣言は行いません。トランザクションを宣言してコミットしようとしましたが、問題は同じでした。
トランザクション スコープ内で Entity Framework (EF1) からストアド プロシージャを呼び出すことはできませんか?
この例外は、使用中のブロックが閉じられたときに、transaction.Complete() の後でのみスローされます。
内部例外:
更新: 報奨金を開始しました
今日、Entity Framework を介してこのプロシージャ コールを行うことはもうありません。私は ADO.net を介して手順を呼び出しています。これが私の回避策でした。しかし、問題は続きます。近い将来、おそらくトランザクション スコープ内でいくつかの呼び出しを行う必要があります。
informix - Informix .NET Provider と TransactionScope がロールバックしない
私は、2 つのテーブル (1 つは MS SQL Server テーブル、もう 1 つは Informix Dynamic Server テーブル) に単純な挿入を行う、概念実証の分散トランザクション アプリケーションを少し持っています。問題は、例外がスローされたときに発生します。Informix 用の OLE DB ドライバーを使用すると、すべて正常に動作します。両方の挿入がロールバックします。.NET Data Provider for Informix を使用すると、Informix 挿入がロールバックしません。
誰が何が起こっているかについて何か考えを持っていますか?
コード スニペットでは、コメント アウトされた EnlistTransaction() メソッドに気付くでしょう。明示的に呼び出すと、メソッドが実装されていないことを示す例外が発生します。
コードスニペット:
接続文字列:
nhibernate - Informix、NHibernate、TransactionScope の相互作用の問題
Informix .NET Provider を使用して、NHibernate 挿入を TransactionScope オブジェクトの Informix データベースにラップしようとする小さなプログラムがあります。以下に示すエラーが表示されます。NHibernate セッション トランザクションで挿入がラップされている場合を含め、TransactionScope オブジェクトのないコードは機能します。問題が何であるかについてのアイデアはありますか?ところで、EnterpriseServicesInterop がないと、Informix .NET Provider は TransactionScope トランザクションに参加しません (NHibernate を使用せずに検証済み)。
コードスニペット:
スタックトレース:
NHibernate.ADOException は未処理でした Message="Could not close IBM.Data.Informix.IfxConnection connection" Source="NHibernate" StackTrace: at NHibernate.Connection.ConnectionProvider.CloseConnection(IDbConnection conn) at NHibernate.Connection.DriverConnectionProvider.CloseConnection(IDbConnection conn ) NHibernate.Tool.hbm2ddl.SuppliedConnectionProviderConnectionHelper.Release() で NHibernate.Tool.hbm2ddl.SchemaMetadataUpdater.GetReservedWords(Dialect ダイアレクト、IConnectionHelper connectionHelper) で NHibernate.Tool.hbm2ddl.SchemaMetadataUpdater.Update(ISessionFactory sessionFactory) で NHibernate.Impl.SessionFactoryImpl ..ctor (構成 cfg、IMapping マッピング、設定設定、EventListeners リスナー) NHibernate.Cfg.Configuration で。D:\Development\ScratchProject\HelloNHibernate\Employee.cs:line 73 の HelloNHibernate.Employee.OpenSession() の BuildSessionFactory() D:\Development\ScratchProject\HelloNHibernate\Employee.cs:line の HelloNHibernate.Employee.TestTScope() D:\Development\ScratchProject\HelloNHibernate\Program.cs: の HelloNHibernate.Program.Main(String[] args) で 53:System.AppDomain._nExecuteAssembly(アセンブリ アセンブリ、String[] args) で System.AppDomain.ExecuteAssembly で 19 行目(String assemblyFile, Evidence assemblySecurity, String[] args) System.Threading.ThreadHelper.ThreadStart_Context(オブジェクト状態) で Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() で System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback コールバック、Object state) at System.Threading.ThreadHelper.ThreadStart() InnerException: IBM.Data.Informix.IfxException Message="ERROR - no error information available" Source="IBM.Data.Informix" ErrorCode=-2147467259 StackTrace: IBM で。 IBM.Data.Informix.IfxConnection.DisposeClose() の Data.Informix.IfxConnection.HandleError(IntPtr hHandle, SQL_HANDLE hType, RETCODE retcode) IBM.Data.Informix.IfxConnection.Close() の NHibernate.Connection.ConnectionProvider.CloseConnection( IDbConnection conn) InnerException:ErrorCode=-2147467259 StackTrace: at IBM.Data.Informix.IfxConnection.HandleError(IntPtr hHandle, SQL_HANDLE hType, RETCODE retcode) at IBM.Data.Informix.IfxConnection.DisposeClose() at IBM.Data.Informix.IfxConnection.Close() NHibernate.Connection.ConnectionProvider.CloseConnection (IDbConnection conn) InnerException で:ErrorCode=-2147467259 StackTrace: at IBM.Data.Informix.IfxConnection.HandleError(IntPtr hHandle, SQL_HANDLE hType, RETCODE retcode) at IBM.Data.Informix.IfxConnection.DisposeClose() at IBM.Data.Informix.IfxConnection.Close() NHibernate.Connection.ConnectionProvider.CloseConnection (IDbConnection conn) InnerException で:
asp.net - 中程度の信頼の TransactionScope
Mosso でホストされている ASP.NET MVC アプリケーションを実行していますが、中程度の信頼ですべてを実行しているため、DTC を有効にできないとのことです。
そのため、TransactionScope を参照するコードを実行すると、次のエラーが発生します。トランザクション マネージャは、リモート/ネットワーク トランザクションのサポートを無効にしました。(HRESULT からの例外: 0x8004D024)
とにかくこれを回避する方法はありますか?
c# - 必ず接続プールを使い果たすTransactionScopeヘルパー-ヘルプ?
しばらく前に、予期していなかったときにTransactionScopeがMSDTCにエスカレートすることについて質問しました。(前の質問)
要約すると、SQL2005では、TransactionScopeを使用するために、TransactionScopeの存続期間内にインスタンス化して開くことができるのは単一のSqlConnectionのみです。SQL2008では、複数のSqlConnectionsをインスタンス化できますが、一度に開くことができるのは1つだけです。SQL2000は常にDTCにエスカレートします...アプリケーションであるWinFormsアプリではSQL2000をサポートしていません。
単一接続のみの問題に対する私たちの解決策は、LocalTransactionScope(別名「LTS」)と呼ばれるTransactionScopeヘルパークラスを作成することでした。これはTransactionScopeをラップし、最も重要なこととして、アプリケーションの単一のSqlConnectionインスタンスを作成および維持します。幸いなことに、それは機能します。さまざまなコードでLTSを使用でき、それらはすべてアンビエントトランザクションに参加します。非常に素晴らしい。問題は、作成されたすべてのルートLTSインスタンスが接続プールから接続を作成し、効果的に強制終了することです。「効果的にキル」とは、SqlConnetionをインスタンス化することを意味します。これにより、新しい接続(何らかの理由で、プールからの接続を再利用することはありません)。ルートLTSが破棄されると、接続を解放してプールに戻すことになっているSqlConnectionを閉じて破棄し、再利用できるようにします。明らかに再利用されることはありません。プールは最大になるまで膨張し、max-pool-size+1接続が確立されるとアプリケーションは失敗します。
以下に、LTSコードの簡略版と、接続プールの枯渇を示すサンプルコンソールアプリケーションクラスを添付しました。接続プールの肥大化を監視するには、SQL ServerManagmentStudioの「ActivityMonitor」または次のクエリを使用します。
ここにLTSを添付します。これを使用して、プールからの接続を消費し、再利用したり解放したりしないことを自分で示すことができるコンソールアプリケーションのサンプルを作成します。LTSをコンパイルするには、System.Transactions.dllへの参照を追加する必要があります。
注意事項:SqlConnectionを開いたり閉じたりするのは、ルートレベルのLTSであり、常にプール内の新しい接続を開きます。ルートLTSインスタンスのみがSqlConnectionを確立するため、LTSインスタンスをネストしても違いはありません。ご覧のとおり、接続文字列は常に同じであるため、接続を再利用する必要があります。
接続が再利用されない原因となる、私たちが満たしていない不可解な条件はありますか?プーリングを完全にオフにする以外に、これに対する解決策はありますか?
これは、接続プールの枯渇を示すProgram.csです。
c# - C# - System.Transactions.TransactionScope
TransactionScope クラスに興味がありました。
ほとんどの場合、データベース接続を目的としていると思います (これは私が使用したものです)。
私の質問は、TransactionScope の using-block に任意のコードを入れてトランザクション対応にすることはできますか? MS のドキュメントはこれについて明確ではありません。
データベース接続以外のコードをトランザクション対応にするために使用できる場合、どのコードがサポートされていますか? System.IO.File 操作をトランザクション化できるとしたら、私にはおかしなことに思えます。
c# - C# のファイルを使用した TransactionScope
私は TransactionScope を使用してデータベースを操作してきましたが、いい感じです。私が探しているのは次のとおりです。
しかし、明らかにこれは機能しません。20 個のファイルがあり、9 番目のファイルで例外が発生した場合、前の 8 個はすべて変更されたままになり、残りは変更されません。ロールバックは実行されません。では、ファイルに対してスコープのような動作を実装する最良の方法は何でしょうか?
簡単な答えがあることを願っていますが、そうでない場合は、いくつかのヒントを教えていただくか、関連記事を教えていただけますか?
c# - メッセージ キューでの TransactionScope の問題
次の問題に直面しています。次のようなコードがあります。
ProcessDataRelatedWithThePreviousInserts で条件をチェックし、必要に応じて残りのワークフローを他のサーバーのメッセージ キューにリダイレクトします。もう一方のサーバーで、メッセージを回復し、ワークフローを続行します (基本的に、DoSomething メソッドの挿入に関連する挿入をいくつか行います)。
DoSomething メソッドで TransactionScope を削除した場合にのみ、これを行うことができるため、これは理論上です。やりたいことを達成する方法はありますか、それともトランザクションの処理方法を変更する必要がありますか?