2

ここに画像の説明を入力私は解決策を探していましたが、これまでのところ運がありません。

説明: 私 (社内の私) は、かなり高速で小規模な作業を行うストアド プロシージャを使用しています。これを SP_Small と呼びましょう。小さいので、更新があり、別のストアド プロシージャを実行します。したがって、SELECTS と UPDATES を 1 つの選択に組み合わせてアトミックにしようとしても、実際には実行できません。(私が偶然見つけた提案された解決策の1つ)

いくつかの異なるドキュメントを並行してデータベースにインポートするインポート メカニズムがあります。各インポートはトランザクション内にあります (インポートを起動するアプリケーションによって実行されます)。各インポートは SP_Small を呼び出して、いくつかのインポートと作業を行います。

問題: 現在、SP_Small は事実上アトミックですが、アクセスする (そして共有される) レコードは、外部トランザクションがコミットされるまでロックされたままになり、プロセス全体が並列ではなくシリアルになります。

要件: SP_Small をアトミックにし、同時に 1 つのプロセスだけが実行されるようにしますが、実行後は残りのプロセスを並行して実行できるようにします。

これは単純な (そして醜い :)) 問題の図です。明確にするのに役立つことを願っています。

4

2 に答える 2

1

SP_Smallプロセスの外部トランザクションから自律型にすることは 1 つのオプションですが、それが唯一のオプションではなく、おそらく優先されるオプションでもありません 。

他の 2 つのオプションは次のとおりSP_Smallです。通常は、これが推奨されるオプションです。

または 2) 分離レベルを変更して、自己ブロックが発生しないようにします。もちろん、SP_Small現在シリアル化されている理由と詳細を知らずに、これらのいずれかの作業能力を評価することはできません.

また、ここで実際に何が起こっているのか、ここで実際に何が必要なのかの詳細にもよりますが、必ずしもこれらが唯一の選択肢ではありません。

于 2013-10-18T13:25:52.227 に答える
0

SP_Small「外部トランザクション」の開始時に実行する必要がありますか? プロセス 1 がプロセス 2 をブロックする理由は、プロセス 1 がコミットするまで更新するすべての行に対して排他ロックを保持するためです。排他ロックは、他のトランザクションがそれらのロックされた行を読み取ることさえも阻止します。SP_Small長いインポート メカニズムの後に実行できますか、それともインポートの結果に影響しますか? これを行うと、各プロセスが行をロックする期間がはるかに短くなります。それが不可能な場合は、呼び出しの直後にトランザクションをコミットしSP_Small、インポート メカニズムが失敗した場合に別の方法で元に戻すことができますか?

于 2013-10-18T22:00:52.400 に答える