問題タブ [nested-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.
mysql - Web サービスで MySQL セーブポイントを実際に使用していますか?
特に重要な Web サービスで、 MySQLセーブポイントを (直接または ORM 経由で)使用して共有できる経験がある人はいますか? 実際にどこで使ったことがありますか?それらは十分に信頼できますか (かなり最近のバージョンの MySQL を実行する意思があると仮定して)、それとも最先端または高価すぎますか?
最後に、次のユースケースのような経験をしたことがある人はいますか?そのためにセーブポイントを使用しましたか? ある特定の作業単位の主なポイントが、同じトランザクションでテーブルに行を追加しOrders
(もちろん、順序に関連する必要はありません)、テーブルを更新することであるとします。可能な限り更新するOrdersAuditInfo
ことは不可欠ですが、テーブルはそれほど重要ではありません (たとえば、エラーをファイルに記録するだけで問題ありませんが、トランザクション全体を続行できます)。低レベルでは、次のようになります (警告、疑似 SQL が続きます)。Orders
OrdersAuditInfo
しかし、ここでも、より良い (または少なくともより一般的な) イディオムがあるのではないでしょうか? まったく別のトランザクションで挿入を行うこともできますが、最終的に実際に機能しない限り、テーブルに書き込まれないOrdersAuditInfo
ことが保証されているとよいでしょう。OrdersAuditInfo
COMMIT
sql-server - SQL Server 2005: トランザクションに名前を付ける理由
私はSQLサーバーでネストされたトランザクション全体を整理してきました.ネストされたトランスの動作を理解するためのこれらのナゲットを輝かせました。
- トランザクションをネストする場合、最も外側のコミットのみが実際にコミットされます。
- 「Commit Trans txn_name」は、ネストされている場合、txn_name が外側のトランザクションを参照している場合でも、常に最も内側のトランザクションに適用されます。
- "ROLLBACK TRAN" (名前なし) は、内部トランザクションであっても、すべてのトランザクションをロールバックします。
- "ROLLBACK TRAN txn_name" - txn_name は、最も外側の txn 名を参照する必要があります。そうでない場合、失敗します。
これらを考えると、トランザクションに名前を付ける利点はありますか? コミットまたはロールバックのいずれかで、特定のトランザクションをターゲットにするために使用することはできません。コードのコメント化のみを目的としていますか?
ありがとう、
ヨニ
mysql - ネストされたトランザクションはMySQLで許可されていますか?
MySQLはネストされたトランザクションの使用を許可しますか?
.net - .NETデータプロバイダー-何ができるかをどのように判断しますか?
トランザクションをサポートしていない、またはネストされたトランザクションをサポートしていないプロバイダーを使用して実行できるコードがあります。
そのようなサポートをプログラムでどのように決定しますか?
たとえば、以下のコードは、MySQL .NETコネクタを使用する場合、最後のコミットでSystem.InvalidOperationExceptionをスローしますが、MSSQLでは正常に機能します。
プロバイダーのタイプに基づいてテストをハードコーディングすることなく、さまざまなプロバイダーに対応するようにコードを変更できるようにしたいと思います(たとえば、実行する必要はありませんif(typeof(connection) == "some provider name")
)
nhibernate - NHibernate のネストされたトランザクション動作の実現
NHibernate のトランザクション制御と FlushMode オプションを使用して、ある種のネストされたトランザクション動作を実現しようとしていますが、読みすぎて少し混乱してしまったので、以下にリストする事実についての確認は非常に役立ちます。
私が望むのは、小さなトランザクションに分割される 1 つの大きなトランザクションを開くことです。次のシナリオを想像してください。
- TX1 は TX を開き、個人のレコードを挿入します。
- TX2 は TX を開き、この Person の名前を P2 に更新します。
- TX2 コミット;
- TX3 は TX を開き、この人の名前を P3 に更新します。
- TX3 ロールバック。
- TX1 はコミットします。
NH が INSERT と TX2 UPDATE をデータベースに送信し、ロールバックされた TX3 を無視することを望みます。
FlushMode = Never を使用して、適切な Begins/Commits/Rollbacks が要求された後にのみセッションをフラッシュしようとしましたが、コミットやロールバックとは関係なく、NH は常にオブジェクトの最終状態でデータベースを更新します。それは正常ですか?FlushMode = Never で作業する場合、NH は本当にトランザクション制御を無視しますか?
FlushMode = Commit を使用してネストされたトランザクションを開くことも試みましたが、ADO.NET のため、ネストされたトランザクションは実際には常に同じトランザクションであることがわかりました。
「オールオアナッシング」の動作を達成しようとしているわけではないことに注意してください。私はセーブポイントの働き方にもっと目を向けています。NHでそれを行う方法(セーブポイント)はありますか?
前もって感謝します。
フィリペ
c# - ADO.NETおよびSQLServerでネストされたトランザクションを有効にするにはどうすればよいですか?
取引中であるかどうかを確認する方法と同様の質問があります。チェックする代わりに、ネストされたトランザクションを許可するにはどうすればよいですか?
ADO.NETでMicrosoftSQLServerデータベースを使用しています。T-SQLを使用した例と、beginを使用してトランザクション名を使用してトランザクションを開始する例を見てきました。connection.BeginTransactionを呼び出すときに、同じ接続で別の関数を呼び出すと、BeginTransactionが再度呼び出され、例外が発生します。
多くのMicrosoftの亜種がこれを許可しているようですが、.mdfファイルでそれを行う方法がわかりません。
C#とADO.NETを使用してMicrosoft SQL Serverデータベースでネストされたトランザクションを許可するにはどうすればよいですか?
.net - 休止状態およびネストされたトランザクション
nhibernate がネストされたトランザクションをサポートしていないことは知っています。
私がこのようなものを得たとしましょう:
- UserService.BeginTransaction (現在のセッションで)
- UserService.Save
- UserService->FeedService
- FeedService.BeginTransaction (現在のセッションで)
- FeedService.Save
- FeedService.Commit (#3.1 で返されたトランザクションで)
- UserService->AddressService
- AddressService.BeginTransaction (現在のセッションで)
- AddressService.Save
- AddressService.Commit (#4.1 で返されたトランザクションについて)
- UserService.Commit (#1 で返されたトランザクションで)
#3.3 でコミットが呼び出されるとどうなりますか?トランザクションはコミットされますか? 成功するか失敗するかのいずれかが必要です。
c# - TransactionScopeもネストされたトランザクションもサポートされていない場合はどうすればよいですか?
TransactionScopeはすばらしい機能ですが、正しく実装しているプロバイダーは少なすぎます。接続をパラメータとして渡したくありません。
ruby-on-rails - Rails 3. ネストされたトランザクション。子ブロックでの例外
子ブロックで例外が発生した後、ネストされたトランザクションで ActiveRecord ロールバックが変更されないのはなぜですか?
以下に例を示します。
1.
2.
ありがとう。
Debian GNU/Linux 5.0.6;
ルビー 1.9.2;
Ruby on Rails 3.0.1;
SQLite 3.7.3。
.net - ActiveRecord でネストされたトランザクションを必要とするネストされた UI
モデル タイプ M1 を編集するダイアログ D1 と、モデル タイプ M2 を編集する別のダイアログ D2 があります。M2 に含まれるものの 1 つは M1 への参照であるため、ユーザーの利便性のために、D1 と D2 の両方にトップレベルからアクセスできることに加えて、D2 には D1 を起動するボタンが含まれています。
D1 と D2 はそれぞれ、入力時にTransactionScope
(を使用してTransactionMode.New
) を作成し、ユーザーがダイアログを操作するとモデル オブジェクト (M1 または M2) を変更し、ユーザーが [OK]/[キャンセル] ボタンを押すと、必要に応じてコミット/ロールバックします。
ダイアログが最上位から開かれている場合、これは単独で正常に機能します。
D1 を D2 内から開いた場合、D1 で [OK] をクリックするとすぐにデータベースに保存され、M1 での変更が D2 に表示されるという動作が期待されます。(その後、D2 は、M1 に影響を与えることなく、M2 への独自の変更を保存またはキャンセルできます。)
実際に起こっていることは、D1 が閉じるとき (および D2 が閉じる前) に M1 への変更がデータベースに保存されているように見えますが、D2 は M1 への変更を認識できないということです。おそらく、D2 のセッション/トランザクションが最新のオブジェクトがあるため、FindFirst
etc が呼び出された場合でも、データベースを再クエリしません。(M2への変更を失うことなく)それを強制する方法はありますか?
(別の奇妙な動作は、D1 と D2 の両方が にフックすることTransactionScope.OnCompleted
ですが、これは、D1 が D2 から呼び出された場合に D2 が閉じられている場合にのみ D1 で起動します。)