異なるプロセスに対して異なるデータベースユーザーを作成することでデッドロックを回避できますか?複数のプロセスがSQLの同じテーブルで動作しているときにデッドロックを回避する方法
API「ABC」と通信する1人のユーザと、API「ABC」と「PQR」によってもたらされる処理システムデータのためのAPI「PQR」および他のユーザと通信するための1人のユーザ。これらのユーザーはすべて同じテーブルを処理します。
異なるプロセスに対して異なるデータベースユーザーを作成することでデッドロックを回避できますか?複数のプロセスがSQLの同じテーブルで動作しているときにデッドロックを回避する方法
API「ABC」と通信する1人のユーザと、API「ABC」と「PQR」によってもたらされる処理システムデータのためのAPI「PQR」および他のユーザと通信するための1人のユーザ。これらのユーザーはすべて同じテーブルを処理します。
個人的に、複数のユーザーが同時に行を更新しているときにデータベースの整合性を維持するために、タイムスタンプ列を表に追加することができます。また、テーブルを再クエリすることなく更新された行数と行数を知りたい場合があります。
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;
デッドロックは、同じリソース(テーブル、インデックス、行など)のために戦って、異なるセッションで、SQLサーバはセッションの所有者が誰であるかを気にしないので、それは複数を有する同一のユーザーことができ起こりますセッションまたは複数のユーザー。デッドロックを避けるために複数のユーザーを作成するだけでは役に立ちません。助けることができる
物事.....同じ順序で
は、私はあなたが別のプロセスにアクセスして別のユーザーを持っているでしょうが、それが実際にデッドロックの問題を修正wouldntのため、それがデッドロックを防止するであろうと思います。このMinimizing Deadlocks
を見てください。デッドロックは、2つのエンティティが同じデータにアクセスしている/データがブロックされていて、誰もトランザクションを終了できない場合が多いです。それはもう一方が終了するのを待っているキャッチ22のようなものですが、どちらも傾けません。プロセスごとに異なるユーザーを作成すると、デッドロックは防止されますが、実際には実用的ではありません。
通常のアプローチ/ベストプラクティスは、単に取引は実体がそれらにアクセスしている特定の順序でロックされるように、ロックを使用するようにシステムをプログラムすることです。これにより、トランザクションがデッドロック・シナリオに陥るのを防ぐことができ、あるトランザクションがデータを使用している場合、同じピースにアクセスしようとする別のトランザクションは、処理を続行する前に他のトランザクションが完了するのを待たなければなりません。
すべての場合に適しているわけではありませんが、ストアドプロシージャ内で処理ロジックを処理し、 'sp_getapplock'を使用してプロシージャトランザクションが同時に使用されないようにします。
あなたが書いたことから、私はあなたが意味するデッドロックであるかどうかわかりません。データベースのロックはかなり正常です。 – Leonidas199x
異なるプロセスで同時にデッドロックを取得する方が簡単でしょうか?あなたはロックの順序を制御することはできません。おそらくこのページを最初にチェックしたいと思うかもしれません:[デッドロックの最小化](https://technet.microsoft.com/en-us/library/ms191242(v = sql.105).aspx) – Prisoner