摘要:
在上一篇中忘記了一個細節(jié)。Range T-K 到底代表了什么?Range T-K Lock 代表了在 SERIALIZABLE 隔離級別中,為了保護范圍內(nèi)的數(shù)據(jù)不被并發(fā)的事務影響而使用的一類鎖模式(避免幻讀)。它由兩個部分構成:第一個部分代表了他鎖定了一個索引范圍,在這個范圍內(nèi),所有索引使用 T 鎖進行鎖定;第二個部分是而這個范圍內(nèi)已經(jīng)命中的Key,這些 Key 將使用 K 鎖進行鎖定。合并在一起我們說在這個范圍內(nèi),索引范圍和特定的row的鎖定模式為 Range T-K。舉上一篇的一個例子吧:SELECT [data] FROM [MyTable] WHERE [index_column]&g
閱讀全文
摘要:
在這篇隨筆中,我們的主要關注點在 Key-Range Lock。Key-Range Lock有 S-S、S-U、I-N、X-X幾種情況。我們一個一個來說,力求明白。遺憾的是,這里可能會比較冗長,那么死鎖分析只好依次順延了。Range S-S鎖的獲取規(guī)則MSDN 對 Range 鎖的規(guī)則有部分描述,但是言簡意賅,以下我們會將各種情況分解開來,理清MSDN中涉及的或者未涉及的規(guī)則,這些規(guī)則適用于SQL Server 2000/2005/2008/2008 R2。關于MSDN的描述,請參見:http://technet.microsoft.com/zh-cn/library/ms191272(en-
閱讀全文
摘要:
最近在項目中進行壓力測試遇到了數(shù)據(jù)庫的死鎖問題,簡言之,如下的代碼在 SERIALIZABLE 隔離級別造成了死鎖:SELECT @findCount=COUNT(id) FROM MyTableWHERE [fk_related_id]=@ArgumentIF (@findCount > 0)BEGIN ROLLBACK TRANSACTION RETURN ERROR_CODEENDINSERT INTO MyTable ([fk_related_id],…)VALUES (@Argument,…)COMMIT TRANSACTIONRETURN SUCCESS_CODE在搞清楚這個
閱讀全文