最近のケースでは、テストや正式な環境では、複数のデータベース・トランザクション・デッドロック(デッドロック)、トランザクションがある一方で犠牲に遭遇し、一度にも起因して、(内部並列クエリは、クエリ内の並列デッドロックを結び目)デッドロックのクエリのトランザクションを打ちますSQL Serverのデッドロックので経験不足のため、彼はマルチ触れた触れたことがない、最初のステップは、デッドロックのレコード情報の問題の解決策を取ることです、多くの理由(デッドロック)のために起こります。
デッドロックの問題を観察するために、いくつかのノートツール。
- トレースフラグ(1222,1204)
- SQLプロファイラ
- 拡張イベント
彼の妻はまた、エンジニアは簡単DIYだったように我々は、4つの音の中にコンテンツを置きます。
最初の準備ができてデッドロック環境の第一章。
ノット:
ループ結び目、互いの業務が、連動の資源排他的使用の一般的なタイプは、このリソースは、それがスレッド、メモリ、さらには外部リソースかもしれさまざまなデータ・オブジェクト(テーブル、ページング、データ列)であってもよいです。
何が起こるかというと二つ以上のトランザクションが、それぞれがリソースをロックし、他のトランザクション間のトランザクションをロックしようとしたいたときは、恒久的な封鎖デッドロックである(ブロッキング)輸入デッドロック、その結果、リソースをロックしているということです。シンプルな伝説を描きます:
取引の行き詰まりの間
- (1)トランザクション1は、リソース1ロック(ホールド)を保持しますが、トランザクションが終了していないので、次のコマンド(3)のために準備されます。
- (2)トランザクション2は、ロック(ホールド)リソース2を保持しているが、トランザクションが終了していないので、次のコマンド(4)のために準備されます。
- (3)トランザクション1はリソース2ロックを調製したが、リソース2 2がトランザクションロックされ、一時的に待機(ウエイト)が遮断されます。
- (4)トランザクション2準備リソース1ロックが、リソース1トランザクション1がロックされ、一時的に待機(ウエイト)が遮断されます。
- リソースがあなたに巻き込まので、私は、私はあなたのサイクル(円形待機)状態を待ちます待って、作品のどれも継続することはできません、使用Trsnaction 1及び2は、(相互排他)相互に排他的である見つけることができ、デッドロック状態がありました。
幸いなことに、この時のSQL Serverの公平な仲裁を扇動、私は私の大きな、SQL Serverの意志を終え、いわゆる小さな犠牲低取引コスト回収取引の犠牲(被害者)あまりにも長い間のトラフィック行き詰まりを避け、大きな結び目をしましょう。
トランザクション2が犠牲を強いられている(他の書き込みトランザクションを使用してクエリまたは更新トランザクションの競合を、回復クエリの取引コストが最も低いです)
ループ結び目:
ループ結び目、単純な連動
複雑な三角関係、複数のトランザクション間の行き詰まりの封鎖。
結び目(デッドロック)環境を構築
正常に完了した後、今日のノートを作成するには、ご使用の環境を準備します。
1.データベースのデッドロックの確立は、テストのために必要
CREATE DATABASE [DeadLockDb]
CONTAINMENT = NONE
ON PRIMARY
( NAME = N'DeadLockDb', FILENAME = N'C:tempdbDeadLockDb.mdf' , SIZE = 5120KB , FILEGROWTH = 1024KB )
LOG ON
( NAME = N'DeadLockDb_log', FILENAME = N'C:tempdbDeadLockDb_log.ldf' , SIZE = 2048KB , FILEGROWTH = 10%)
GO
2. 2つのデータテーブルの設立は、結び目をテストするために必要
create table t1
(
c1 int identity,
c2 varchar(30)
)
create table t2
(
c1 int identity,
c3 varchar(30)
)
3.結び目をテストするために必要な試験データの確立
insert t1 VALUES('Stanley')
insert t2 VALUES('Suzie')
テストの結び目の構文を実行します
以下のような2つのトランザクション限り、相互排他ロックは、長い時間(15秒)と異なるリソースのアクセスシーケンステーブルオブジェクト。
クエリウィンドウ1(最初の更新およびT1、T2を更新)
BEGIN Tran Tran_one
UPDATE t1
set c2 = 'lock'
WAITFOR DELAY '00:00:15';
UPDATE t2
set c3 = 'lock'
ROLLBACK
クエリウィンドウ2(T2を更新し、T1を更新する):15秒以内に行わなければなりません
BEGIN Tran Tran_two
UPDATE t2
set c3 = 'lock'
WAITFOR DELAY '00:00:15';
UPDATE t1
set c2 = 'lock'
ROLLBACK
1×2クエリの実行結果ウィンドウ:
2クエリウィンドウには、次のエラーメッセージが表示されます。
メッセージ 1205 、レベル 13 、状態45、行15トランザクション(処理シーケンス識別コード59)は、さらに、リソースのロックをロックするために処理され、デッドロックの対象として選択されています。トランザクションを再実行してください。
のみログ観測した場合、我々は唯一の犠牲にするエラーメッセージがある以上1205 APを受け取ることができ、我々は戻ってくると、デッドロックを観察するためにいくつかのツールを指摘しています。
要約:
循環の方向は、デッドロックを解決します:
- 1205エラーが発生したプログラムハンドルの後、再実行自動的に、数秒待ってください。
- オブジェクトにアクセスするのと同じ順序で、粒子サイズの減少ロック(表ロック - >キーロック)、より低い分離レベルとロック時間(パフォーマンスチューニング)等を減少させました。
参考:
technet侦测与结束死结
https://technet.microsoft.com/zh-tw/library/ms178104(v=sql.105).aspx
Deadlocking
https://technet.microsoft.com/en-us/library/ms177433(v=sql.105).aspx
处理死结
https://technet.microsoft.com/zh-tw/library/ms177453(v=sql.105).aspx
将死结数量降至最低
https://technet.microsoft.com/zh-tw/library/ms191242(v=sql.105).aspx
原文:大专栏 [SQL Server][DeakLock]观察死结的工具(一)首部曲