1

トランザクション スコープはどのように機能しますか? 別のコンテキストが既に使用されていることをどのように認識し、コードに別の種類のスコープを実装するにはどうすればよいでしょうか。

私は主に vb.net の開発者ですが、c# を記述すれば読むことができます。

上記が曖昧すぎる場合:

system.transactions の機能とその使用方法を理解しています。私が知りたいのは、system.transactions スコープと同じ方法でそれを処理できるコードをラップできる、同様の独自のライブラリを作成する方法です。これをキャッシング モデルで使用する予定であり、大幅に強化されます。たとえば、トランザクションスコープが親スコープがあり、それにアタッチできること、またはコミットをより高いレベルまたはより高い連絡先で行う必要があることをどのように認識するかについての詳細を探しています。

たとえば、次のものがあれば

using scope1 as new system.transactions.scope
    using scope2 as new system.transactions.scope
        using scope3 as new system.transactions.scope
             scope3.commit
        end using
        scope2.commit
    end using
end using

スコープ 1 はコミットされず、スコープ 2 もスコープ 3 もコミットされません。これは、それらすべての親がスコープ 1 のコンテキストであるためです。これを独自のライブラリで設定できるようにしたいと思います。

4

5 に答える 5

7

I suggest the article Introducing System.Transactions by Juval Lowy

于 2009-01-07T02:01:23.097 に答える
0

あなたの質問は非常にあいまいなので、実際に何を求めているのか、答えとして何を求めているのかを知るのは難しいですが、おそらくこれは役に立ちますか?

http://www.codeproject.com/KB/dotnet/TransactionScope20.aspx

于 2009-01-06T23:50:50.020 に答える
0

突き刺しますが、質問に 100% 確信があるわけではありません。

データベースに関しては、トランザクションはスコープを持つ傾向があります。これは、トランザクション内で変更されるデータ量の範囲を示します。これらはデータベース サーバーに実装されており、「コード内」で変更することはできません。各データベース サーバーには独自の実装があり、各サーバー (Oracle、MSSQL、MySQL) には独自の動作があります。

通常、トランザクションは、変更中のデータを読み取る他の接続をロックアウトします。トランザクションの範囲は、可能な限り小さく開始し、変更されるデータの量が増えるにつれて拡大します。可能な限り少ないデータをロックすることがデータベースの最善の利益であり、次の方法でこれを行います。

  • 1 行のデータ内の 1 列をロックする
  • 次に、単一行のデータをロックします
  • 次に、データのページをロックします(おそらく8096バイト?)
  • 次に、データのテーブル全体をロックします

更新によって複数行のデータが変更された場合、トランザクション スコープはページ サイズ (サーバーごとにカスタム) に拡張されるか、テーブル全体がロックされます。一部のデータベース サーバーは、トランザクションの進行中に、更新前と同じように他の接続がテーブルを読み取ることを許可し、他のデータベース サーバーは、トランザクションがコミットされるまでデータの選択をブロックします。

基本的に、サーバーの実装方法を変更することはできず、トランザクション スコープはあまり気にする必要はありません。相互に依存する簡潔な更新の周りでのみトランザクションを使用するようにしてください。私は通常、トランザクションを使用しません。しかし、繰り返しになりますが、私は銀行口座やその他の参照が重要なシステムを扱っていません。

お役に立てれば!

于 2009-01-06T23:37:07.520 に答える
0

スコープの動作を再現する解決策を見つけたと思います。すぐに情報を投稿しますが、基本的には、オブジェクトのネストされたインスタンスを追跡するために静的な値で idisposable を実装する必要があります。それをキャッシュプロバイダーに接続するために、キャッシュされたオブジェクトの配列リストを使用する予定なので、オブジェクトが破棄されたときに何らかのクリーンアップを実行します。スレッドの問題に対処する方法も知っていると思いますが、まだロジスティクスに取り組んでいます。完了したら、コードをリリースして、現在直面している課題のいくつかを処理するために、速度の上にデプロイできるようにします。

于 2009-01-08T05:25:56.803 に答える
0

System.Transactions が内部でどのように機能するかはわかりませんが、スレッドローカルメモリを使用してこれを実現できます。.NET では、ThreadStatic 属性がこれを提供します。次のような場所でスコープ コンテキストを宣言します。

[ThreadStatic]
private static Context scopeContextThingy;

スレッドごとに 1 つの scopeContextThingy が存在します。次にscopeContextThingy == null、あなたが親であり、新しいコンテキストを作成する必要があります。それ以外の場合は、ネストされたスコープです。

于 2009-01-08T05:51:33.130 に答える