質問

私はC#Windowsアプリケーションを持っています。ボタン1 '' in 'in' in 'in'をクリックしてくださいデータをいくつかの表に書き込んだプロセスがあります。そのプロセスは通常10分かかります。 1人のユーザーがその「ボタン1」をクリックすると、同じDBとプログラムを使用する別のユーザーが別のフォームでデータを挿入する別のフォームの他のボタンをクリックします。

ボタン1をクリックすると、SQLトランザクションを起動し、プロセスが終了した後にコミットされています。

問題は、そのプロセスを実行するときに、2番目のユーザーがタイムアウトエラーを取得し、彼は自分のプロセスを完了できません。

これのために何ができる? SQLトランザクションの開始が、プロセスに使用して使用するテーブルをロックする場合は?

役に立ちましたか?

解決

私はこれのために何ができる?

トランザクション処理をやり直す。真剣に

通常10分かかるそのプロセス

10分の取引はいかなる手段によっても実用的ではありません。私はこの外部の外部の説得力のある理由を見に失敗しました - そして私はすべて20年間全部でデータベースの仕事をしています。忍容して、通常は長く、通常はそれを回避する方法があります。

はい、タイムアウトを変更することができますが、それはユーザー2が15分間画面を見つめることを意味します。実際の解決策ではありません。

論理的な観点からトランザクションをやり直してください。あなたが最初に何をしていますか?

他のヒント

簡単な解決策は、長い間待つためにユーザーが必要な場合があります。

スレッドを使用してRABLE1を作業状態として取得した場合(WinForm)

   void transaction(data)
    { 
     try
     {
       thread.sleep(100);
       sqltransaction(data);//whatever your code is
     }
    catch(Exception)
     {
       transaction(data);
       label1.Invoke((MethodInvoker)(() => label1.Text = "Requested pending , do not close the program";
     }
       label1.Invoke((MethodInvoker)(() => label1.Text = "Working...";
    }
.

これは私が本当にそれを修正できないというエラーを扱う方法です。

ありがとう

トランザクションは、SQL Serverがコミットで保持され、他の誰かによって変更されないように、他のトランザクションが同じリソースへのアクセスをブロックすることによるものです。

です

SO - あなたができることはあなたのトランザクションをより速く実行させることであるので、ブロックしてロックされません。 2番目のユーザーを待ってください。 または全く取引を使用しないでください。 (またはコードレイヤの「期待動作」の場合は、コードレイヤの「より良い」という状況を扱います)

トランザクションがブロックされていないことを確認することもできますが、2番目のプロセスが本当に同じリソースにアクセスする必要がある場合は、待機する必要があります。

しかし、実際に「汚れ」を取得したい場合は、汚れたデータの読み取りを許可するためにサーバーの絶縁レベルを変更できますが、あなたがしていることを知らない限り私が絶対にアドバイスすることは絶対にありません。しかし、それは読み取りクエリをスピードアップすることができるものですが、それはダーティデータとダーティデータページを読み取るかなり奇妙な結果を持つことができます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top