2017-09-14 8 views
4

異なるプロセスに対して異なるデータベースユーザーを作成することでデッドロックを回避できますか?複数のプロセスがSQLの同じテーブルで動作しているときにデッドロックを回避する方法

API「ABC」と通信する1人のユーザと、API「ABC」と「PQR」によってもたらされる処理システムデータのためのAPI「PQR」および他のユーザと通信するための1人のユーザ。これらのユーザーはすべて同じテーブルを処理します。

+0

あなたが書いたことから、私はあなたが意味するデッドロックであるかどうかわかりません。データベースのロックはかなり正常です。 – Leonidas199x

+0

異なるプロセスで同時にデッドロックを取得する方が簡単でしょうか?あなたはロックの順序を制御することはできません。おそらくこのページを最初にチェックしたいと思うかもしれません:[デッドロックの最小化](https://technet.microsoft.com/en-us/library/ms191242(v = sql.105).aspx) – Prisoner

答えて

0

個人的に、複数のユーザーが同時に行を更新しているときにデータベースの整合性を維持するために、タイムスタンプ列を表に追加することができます。また、テーブルを再クエリすることなく更新された行数と行数を知りたい場合があります。

CREATE TABLE MyTest (myKey int PRIMARY KEY, myValue int, RV rowversion); 

その後、あなたはその後、更新中の[テーブル名]テーブルの上に楽観的同時実行制御を実装するために、次のサンプルのTransact-SQLステートメントを使用することができます。

DECLARE @t TABLE (myKey int); 
UPDATE MyTest 
SET myValue = 2 
    OUTPUT inserted.myKey INTO @t(myKey) 
WHERE myKey = 1 
    AND RV = [row-version-value]; 
IF (SELECT COUNT(*) FROM @t) = 0 
    BEGIN 
     RAISERROR ('error changing row with myKey = %d' 
      ,16 -- Severity. 
      ,1 -- State 
      ,1) -- myKey that was changed 
    END; 
2

デッドロックは、同じリソース(テーブル、インデックス、行など)のために戦って、異なるセッションで、SQLサーバはセッションの所有者が誰であるかを気にしないので、それは複数を有する同一のユーザーことができ起こりますセッションまたは複数のユーザー。デッドロックを避けるために複数のユーザーを作成するだけでは役に立ちません。助けることができる

物事.....同じ順序で

  1. Accessオブジェクト。
  2. トランザクションでのユーザーのやりとりを避けてください。
  3. トランザクションを短く、1つのバッチにまとめます。
  4. より低い分離レベルを使用してください(注意してください)。
  5. 行のバージョン管理ベースの分離レベルを使用します。
  6. READ_COMMITTED_SNAPSHOTデータベース・オプションをONに設定すると、読込みコミット済トランザクションが行のバージョニングを使用できるようになります。
  7. 可能であれば、スナップショットの分離を使用してください(tempdbの邪魔になることに注意してください)。

は、私はあなたが別のプロセスにアクセスして別のユーザーを持っているでしょうが、それが実際にデッドロックの問題を修正wouldntのため、それがデッドロックを防止するであろうと思います。このMinimizing Deadlocks

0

を見てください。デッドロックは、2つのエンティティが同じデータにアクセスしている/データがブロックされていて、誰もトランザクションを終了できない場合が多いです。それはもう一方が終了するのを待っているキャッチ22のようなものですが、どちらも傾けません。プロセスごとに異なるユーザーを作成すると、デッドロックは防止されますが、実際には実用的ではありません。

Deadlock

通常のアプローチ/ベストプラクティスは、単に取引は実体がそれらにアクセスしている特定の順序でロックされるように、ロックを使用するようにシステムをプログラムすることです。これにより、トランザクションがデッドロック・シナリオに陥るのを防ぐことができ、あるトランザクションがデータを使用している場合、同じピースにアクセスしようとする別のトランザクションは、処理を続行する前に他のトランザクションが完了するのを待たなければなりません。

0

すべての場合に適しているわけではありませんが、ストアドプロシージャ内で処理ロジックを処理し、 'sp_getapplock'を使用してプロシージャトランザクションが同時に使用されないようにします。

0

いいえ、最初にこのデッドロックの犠牲者を見てくださいarticle。ほとんどの場合、インデックスがないかインデックスが悪いと、デッドロックが発生します。

ur deadlockの詳細を投稿できる場合は、最善の解決方法を提案できます。

デッドロックを回避するために、priorityを設定する方が良いとの回答に基づいています。

関連する問題