診断デッドロックにはSQL Server2005年
-
09-06-2019 - |
質問
いているも悪も珍しい、行き詰まり状態のスタックオーバーフロー SQL Server2005年のデータベースです。
また、プロファイラを設定し追跡に作用 この記事をブデッドロック, し、捕集の例です。のかということ のdeadlocking書 常に 同:
UPDATE [dbo].[Posts]
SET [AnswerCount] = @p1, [LastActivityDate] = @p2, [LastActivityUserId] = @p3
WHERE [Id] = @p0
その他のdeadlocking算によって異なり、その通常の些細な、シンプル 読む で投稿します。これが殺害され、デッドロックします。以下に例を示します
SELECT
[t0].[Id], [t0].[PostTypeId], [t0].[Score], [t0].[Views], [t0].[AnswerCount],
[t0].[AcceptedAnswerId], [t0].[IsLocked], [t0].[IsLockedEdit], [t0].[ParentId],
[t0].[CurrentRevisionId], [t0].[FirstRevisionId], [t0].[LockedReason],
[t0].[LastActivityDate], [t0].[LastActivityUserId]
FROM [dbo].[Posts] AS [t0]
WHERE [t0].[ParentId] = @p0
するアドベンチャーワールドまなみ書き込み/書きデッドロックが読み取り/書き出します。
た混合物のLINQ、パラメータ化されたSQLクエリーのようです。今までにな with (nolock)
すべてのSQLクエリ.この場合もある。また、シミュレーションをもの)低書バッジクエリそ固定の昨日は、た以上20秒間実行時に、走っていた毎分ます。私たちは、この源泉となったもののロック!
残念ながら、もう一度行き詰まりエラーが約2時間。同じ正確な症状には、正確である彼は述べている。
の不思議なことに、ロッキングにSQL文で上記を参照の一部である特別なコードパスです。この のみ このような場合に新しい答えが追加される問題で新たに親会社の質問に答え回数と最後の日付/ユーザーです。これは、明らかにないのではなく、共通相対的に大量の読み込みをしています!調査を実施しているのは、同じ考えていない膨大な数の書き込みなどのアプリです。
こNOLOCKするような巨大なハンマーが、ほとんどの質問をこちらにする必要はない。まんだユーザープロファイルは数秒のでしょうか?
使用NOLOCKとLinqが少し難しいとして スコットHanselmanて.
まいちゃつくのかとい
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
のデータベースの文脈でのすべての当社のLINQクエリーにこのセットです。なまらい、ラップ毎にLINQ話し---でも、簡単な読書がその大多数)3-4ライン取引コードブロック、醜い.
これやって少し悔しさが残明を読み込みアプリケーションでは2005年までの行き詰まりに書き込みます.この書き込み/書きデッドロックが大きな問題ですが、 を読み込み? まだ走り、銀行のサイトここでは、必要がない完璧な精度です。
アイデア、浮かぶのでしょうか。思いの?
まスをインスタンス化の新しい商品DataContextオブジェクトの操作などに頼まれても同じ静的コンテキストすべてにお電話?
Jeremyを共有す静datacontextのベースコントローラーの大部分:
private DBContext _db;
/// <summary>
/// Gets the DataContext to be used by a Request's controllers.
/// </summary>
public DBContext DB
{
get
{
if (_db == null)
{
_db = new DBContext() { SessionName = GetType().Name };
//_db.ExecuteCommand("SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED");
}
return _db;
}
}
のくらいの新しいコンテキスト毎にコントローラ、またはページあたり、..多?
解決
にMSDN:
http://msdn.microsoft.com/en-us/library/ms191242.aspx
にかかる料金等についての READ COMMITTEDスナップショットまたは をスナップショット分離データベース オプションは、論理的にコピー (バージョン)の維持のためのすべてのデータ 変更を行い データベースです。各行が変更され 特定の取引、 インスタンスのデータベースエンジンの店 バージョンは、先進 イメージは、連続tempdb.各 版の取引 シーケンス番号の取引 この変化します。のバージョン 改行が連鎖をリンク 一覧です。最新の列の値は常に 保存され、現在のデータベース 連鎖の列番号を格納 にtempdb.
短走行の取引、 バージョンの変更が行 キャッシュのバッファプールなし 手書きのディスクファイルの のtempdbデータベースです。る必要がある場合であって、ために の番号列は、短寿命で まだ投下から バッファプールがあり、必ずしも 負I/Oオーバーヘッド。
が、刑の追加費用を引き起こす場合もある。また試験まれます。
設定してみてくださいこのオプションが完了していない商品についてNOLOCKsコードからのクエリではないと本当に必要です。NOLOCKsをグローバルの手法のデータベースの文脈のハンドラとの闘いへのデータベースのトランザクション遮断レベルのバンド-エイズの問題です。NOLOCKSのままのマスクの基本課題と我々のデータ層のことを選択信頼性の低いデータが自動選択-更新を行バージョンが表示されるソリューションとなります。
ALTER Database [StackOverflow.Beta] SET READ_COMMITTED_SNAPSHOT ON
他のヒント
NOLOCK や 未確定の読み は滑りやすいといえます。使ってはいけませんしを把握していない場合は、その行き詰まりが起こっている。う心配ういうこと"を追加(nolock)すべてのSQLクエリ".必要に追加 とNOLOCK どこでもかまいの問題のデータ。
Updateステートメント自体もパッケージをダウンロードする問題がある。いを判定するためのカウント以前の取引は、ワイヤーに引っ掛けて引っ張ってからのオブジェクト? AnswerCount = AnswerCount+1
の場合は追加があり扱います。そして必要な取引に正しい数えられないときには、いくつかの心配もの並行処理で発行する可能性がある自らをさらす。
つくに位置するこの周辺のこの種の行き詰まり問題なく作業なしで可能汚れを読み込みに使用 "Snapshot Isolation Mode"
(新しいアプリケーションでは2005年)することが出来ます。いクリーンを読み込む最終更データです。こすることができるときは、再試行錯綜した状態計算書かなり簡単にしたい場合に処理するのかということで優雅に.
OP質問したいのはなぜこの問題は発生しました。今後の期待に答えることが可能なソリューションをしているか。
この指数関連の問題です。例えば、きのテーブルの投稿は、非クラスタ化されたインデックスでXを含むParentID一(以上)のフィールドを更新(AnswerCount,LastActivityDate,LastActivityUserId).
行き詰まりが起こる場合にはを選択しcmdな共有-読み込みロックのインデックスX検索のParentIdして必要な共有-読み込みロックのクラスタ化されたインデックスを取得し、残りのカラムが更新cmdは書き込み専用のロックのクラスタ化されたインデックスおよび必要書き込み専用ロック指数Xに更新します。
このような状況がロックされたX、取得しようとしたとYは億ッYであることができるようX.
もちろん、する必要がありまOPを更新投稿情報について"土地の再評価を行い、土地再評価にプレーの確認の場合は実際るようになりました。
思を不快にこの問題に係員が答えなのです。あのコミュニケーションも楽しみの"チャレンジする"というこの魔法の粉塵!ることはありませんの魔法の粉塵!"
見えないことに気づいたものだっanaylzedにロックされると定めた正確なタイプのロックが膠着す.
すべてのまっ示されているが、一方ではロックが生じないかdeadlocking.
SQL2005ことができる情報をロックされる:
DBCC TRACEON (1222, -1)
その時の行き詰まりが起きてより良い診断用として開発されました。
まスをインスタンス化の新しい商品DataContextオブジェクトの操作などに頼まれても同じ静的コンテキストすべてにお電話?私はもともとし、後者のアプローチからそういえば、不要なロックました。私は今、新しいコンテキスト毎に原子力動作します。
前焼のチ飛NOLOCK、いくのが行き詰まりのグラフだっ撮影プロファイラ.
忘れずに行き詰まりが必要でに少なくとも2つのロックを解除します。接続1はロックというロックB-逆接続2.これは解決不可能状況は、誰かがいてくれるでしょう。
だがこれまで示してきた問題は簡単にロックは、まさにSqlサーバーに嬉しいいます。
います(LINQ)の開始との取引をすることUPDATEステートメントに囲まれた高原地帯に位置し、選定その他の情報ります。しかし、本当に戻る必要があり、行き詰まりグラフのロック を開催 各スレッド、トラックバックを通じてプロファイラの諸表による人ロック認められることがあります。
期待していることが少なくとも4つの基本パズル(書が複数のロック-うがトリガー、テーブルから).
まんだユーザープロファイルは数秒のでしょうか?
Swsホルテンは完成後も内部が完全に可能です。設定値のベースランザクション遮断レベルを入れるのがベスト/クリーンがかかるものと思われます。
代表的な読み書きの行き詰まりから指の順にアクセス。Read(T1)を置の列のインデックス、そしてそのような見通列インデックスB(通常クラスタリング)Write(T2)で変化を指標B(クラスター)その後は、インデックスの更新とレコードA.T1(S-LckにしたいS-Lck B,T2はX-Lck BというU-LckにA.行き詰まりから、ふ.T1は殺害されました。この流行の環境重OLTP交通っぽく指標:).溶液を作るには、読み込みいてAからBります。含むカラム、または除去カラムから想定リスト)またはT2いてからにな更新物価連動します。残念ながら、linqがないお友達はこちら---
@Jeff-私のレコード店ディスクユニオンの専門家にこもっていた結果とスをインスタンス化して、新しいコンテキストをほとんど毎ます。と思うした新しい接続オブジェクト毎に電話ADO.オーバーヘッドのなど、使ってくださいというふうに思って以来、接続プールはそのままご利用いただけます。
今もグローバル静的ヘルパーのようになります:
public static class AppData
{
/// <summary>
/// Gets a new database context
/// </summary>
public static CoreDataContext DB
{
get
{
var dataContext = new CoreDataContext
{
DeferredLoadingEnabled = true
};
return dataContext;
}
}
}
していて思ったこと。
var db = AppData.DB;
var results = from p in db.Posts where p.ID = id select p;
と私は同じことをなすことにしました。とにかくかくて、シコシコとした交通としてすでにあなたがロックのような成分が含まれていますの共有DataContext早くだけで、ほんの一握ります。いかなる保証ものであえいただけるミュージアムです。
更新:しかし、コードのみを共有するデータコンテキストの寿命のコントローラ側インスタンスは、基本的にはそう微細ない限り、なんとなく併用によるほど複数の通話内のコントローラ部でします。スレッドになるようにScottGuと
コントローラ生のための単一の請求-その加工依頼いゴミ収集したことにDataContext集)...
というわけで、できない可能性のあるもではあるんじゃないでしょうかは試してみる価値も併せて何らかの負荷試験をします。
Q.なぜを格納する AnswerCount
の Posts
テーブルは何でしょう?
代替アプローチを"書く"戻る"を、 Posts
テーブルによる保存の AnswerCount
のテーブルが動的に番号を計算する回答のにしています。
あり、このまま追加バー
SELECT COUNT(*) FROM Answers WHERE post_id = @id
以上の通常の場合だけを表示するためのホームページ):
SELECT p.post_id,
p.<additional post fields>,
a.AnswerCount
FROM Posts p
INNER JOIN AnswersCount_view a
ON <join criteria>
WHERE <home page criteria>
これは、通常、その結果 INDEX SCAN
とする方が効率的利用資源を利用 READ ISOLATION
.
やり方は一つではない肌に。早デ正常化のデータベースのスキーマの紹介ができる拡張性の問題です。
またREAD_COMMITTED_SNAPSHOT設定するのではないのでデフォルトです。することMVCC意味論。も同じことにOracleを使用するデフォルトです。有MVCCデータベースなので非常に有用ないのですが、一つは非常識だ。こして走行させることを可能にする以下の内部取引
更新ユーザー設定名='foobar';//う睡眠。
まずは、上記の皆様に引き続きから選択したテーブルです。場合に慣れていないMVCCき衝撃を受けきって生きることができたはどのくらい実装されているか。けます。
設定デフォルトの読み未確定のない良い方法がありました。お間違いなく紹介矛盾とで終わる問題は以きます。スナップショット離れるようになるものでは急激な変化へのSqlサーバーの作品を 巨大 負荷tempdb.
ここには何を行うと良いでしょう:利用try-catch(T-SQL)の検出に行き詰まり状態です。その時、再実行を返します。この標準のデータベースプログラミング演習.
あの好例では、この手法をポールのNielson Sql Server2005年の聖書.
ここには、迅速テンプレートを使ってい:
-- Deadlock retry template
declare @lastError int;
declare @numErrors int;
set @numErrors = 0;
LockTimeoutRetry:
begin try;
-- The query goes here
return; -- this is the normal end of the procedure
end try begin catch
set @lastError=@@error
if @lastError = 1222 or @lastError = 1205 -- Lock timeout or deadlock
begin;
if @numErrors >= 3 -- We hit the retry limit
begin;
raiserror('Could not get a lock after 3 attempts', 16, 1);
return -100;
end;
-- Wait and then try the transaction again
waitfor delay '00:00:00.25';
set @numErrors = @numErrors + 1;
goto LockTimeoutRetry;
end;
-- Some other error occurred
declare @errorMessage nvarchar(4000), @errorSeverity int
select @errorMessage = error_message(),
@errorSeverity = error_severity()
raiserror(@errorMessage, @errorSeverity, 1)
return -100
end catch;
ことは私にとって過去には必ず全てのクエリ、更新にアクセス資源(テーブル)と同じです。
る場合、一つのクエリの更新を表1,表2および別のクエリを更新してい順2,1次あるいはデッドロック.
投稿をしてくださいき並び順を変更することができますアップデート以降のご利用LINQ.その深山ですから気をつけてください。
まんだユーザープロファイルは数秒のでしょうか?
数秒でもある。いを与えることができそうですが、良くない限り、膨大な数の人を投稿回答でも同時に行います。
いJeremyありがとうございます。まだできるようにする必要がありますの新しいデータコンテキストの各コントローラーまたはページが新規作成し毎に独立を返します。
私は建物の解明るいずれかを使用して、静脈のようにいきましたが、投トのご獣のサーバー(百万円+)間のストレステストし、また読み/書き込みロックん。
どんな戦略の使用に異なるデータコンテキストLINQ力レベルのクエリから信頼されるSQLサーバーが接続プーリングマジック、ロックが消えます。
のコースがありました時の圧力、あてるべきだという結論に達したらいいなと思うことはたくさんの周りにはいきません100%の必ずそれが固定だったこともあって、高い信頼を置いてみましょうすることができてうれしいです。
まぼすおそれのある機器、装置の汚れを読み込み.
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
ない場合は絶対に必要と完璧な取引の健全性とクエリーの使用汚れを読み込みアクセス時にテーブルの高い並行処理.いの龍踊りの"龍"に車輪が表れます。
この場合においわゆる"ファントム読み込みである"がエラーとする行為の際のデータから取引のとれていない為です。
まだ走り、銀行のサイトここでは、必要がない完璧な精度に毎回
利用汚れを読み込み.そうかもしれませんという完璧な精度がクリアアップの死ロック。
なまらい、ラップ毎にLINQ話し---でも、簡単な読書がその大多数)3-4ライン取引コードブロック、醜い
を実装する場合には汚れを読み込み"をベースデータベースコンテキスト"、ラップ、個別の通話をより高い分離レベルが必要な場合は、取引ます。
この問題の実施再送メカニズムは?のものが行き詰まocurringうにしてみてはいかがでしょうか一部ロジックを特定しない。
な少なくとも一部、その他のオプションの導入実績の罰則を定通りに履行されるすべての時再送システムキックにな?
もお忘れなく何らかのログイン時のリトライがいい得る状況の希少なうことも多い。
今見Jeremyかったのを覚えていると聞にベストプラクティスをはDataContext各データは動作します。Rob Coneryの記述ついDataContext、彼はいつものニュースしめるのではなく、シングルトン.
- http://blog.wekeroad.com/2007/08/17/linqtosql-ranch-dressing-for-your-database-pizza/
- http://blog.wekeroad.com/mvc-storefront/mvcstore-part-9/ (コメント)
このパターンを用います。ショーリンクソースビュー CodePlex):
using System.Configuration;
namespace VideoShow.Data
{
public class DataContextFactory
{
public static VideoShowDataContext DataContext()
{
return new VideoShowDataContext(ConfigurationManager.ConnectionStrings["VideoShowConnectionString"].ConnectionString);
}
public static VideoShowDataContext DataContext(string connectionString)
{
return new VideoShowDataContext(connectionString);
}
}
}
その後サービスレベルのもの顆粒は、アップデート):
private VideoShowDataContext dataContext = DataContextFactory.DataContext();
public VideoSearchResult GetVideos(int pageSize, int pageNumber, string sortType)
{
var videos =
from video in DataContext.Videos
where video.StatusId == (int)VideoServices.VideoStatus.Complete
orderby video.DatePublished descending
select video;
return GetSearchResult(videos, pageSize, pageNumber);
}
この合意とグレッグとして長く設定の分離レベルを読み未確定な悪影響とその他のクエリ.
思い知Jeff、どのように設定すれば、データベースレベルなクエリは以下のような:
Begin Tran
Insert into Table (Columns) Values (Values)
Select Max(ID) From Table
Commit Tran
まった場合のサンプルでも数分で出しています。
いまこのように、読み込み後に失敗した場合に?あき焼成トンのランダム読み取ることは少なヒットがなを読み込みます。多くの用途について、それは非常に少ない書き込みに比べ数を読み込みからの読み込みなが近くに高いのが問題です。
場合の実施"読み取り未確定"にな解決問題でも助けることを知らずに多くの処となります。あるその他のチューニングのオプションがあればこの行動です。ない限り,MSSQLグの救出と思い、提出に問題はベンダーです。
私は、引き続き調整にはもどのようにディスクサブシステムかキシコ料理を習う機会はディスクキューです。場合はI/Oのバックアップに問題がないことこれら二つのクエリがdeadlockingので、もし他のクエリがある状態のシステムまたクエリを20秒にてチューニングがあります。
を中心に短縮のクエリー、ベットの行き詰まりの問題ができなくなってしまいます。
同じ問題が利用できないのIsolationLevel=IsolationLevel.ReadUncommitted"をTransactionScopeので、サーバかにDTS有効(!).
私が何か拡張方法
public static void SetNoLock(this MyDataContext myDS)
{
myDS.ExecuteCommand("SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED");
}
ですから、選定した重要な並行処理、テーブルを可能にしていますのnolock"のようになります:
using (MyDataContext myDS = new MyDataContext())
{
myDS.SetNoLock();
// var query = from ...my dirty querys here...
}
Sugestionsも大歓迎!