2

私のアプリケーションは、システム全体のカウンターとして機能するテーブルに書き込む必要があり、このカウンターは、システム全体とすべてのアプリケーションで一意である必要があります。

このカウンターは現在、Oracle データベースのテーブルとして実装されています。

私の問題は、他の複数のプロセスがこれを読み書きする可能性があるため、現在のトランザクションでロックされることなく、このカウンター テーブル (システムへの各ビジネス プロセスでカウンターの一意性を保証するためにいくつかのキーを使用する) に書き込む必要があることです。テーブルも。カウンターのギャップは問題ではありませんが、事前にカウンター値を作成することはできません。

シーケンス番号はフォーマットされた番号であるため、この場合、単純な SEQUENCE は役に立ちません。

今のところ、これを実現するためのデータベース以外の代替手段がいくつかありますが、しばらくの間、システムコードをできるだけ変更したくありません。

実際には、現在のトランザクションに参加しない新しい接続を開き、テーブルに書き込み、この新しい接続を閉じることができれば最も簡単ですが、私の疲れた心はそれを行う方法を見つけることができません.

答えは明らかだろうが、今は光が当たらないだけだ。

4

2 に答える 2

3

「抑制」オプションで作成されたTransactionScopeブロック内でコマンドを実行します。このように、コマンドは現在のトランザクションに参加しません。

using (var scope = new TransactionScope(TransactionScopeOption.Suppress))
{
    // Execute your command here
}

詳細については、http://msdn.microsoft.com/en-us/library/system.transactions.transactionscopeoption.aspxを参照してください。

于 2012-12-17T21:10:04.333 に答える
1

もちろん。外部トランザクションに結合されていない新しいトランザクション(内部トランザクション)を開くように構成されたコンポーネントを作成するだけです。

TransactionScopesの進行状況については、http://msdn.microsoft.com/en-us/library/ms172152%28v=vs.90%29.aspx#Y1642を参照してください。

于 2012-12-17T21:09:16.403 に答える