鎖不住的查詢

2021-08-24 18:36:27 字數 3864 閱讀 7172

環境:sql server 2005 or 2008

最近在處理乙個鎖的問題時,發現乙個比較鬱悶的事,使用x

鎖居然無法鎖住查詢,模擬這個問題,可以使用如下t-sql

指令碼來建立測試環境。

usemaster;go

if@@trancount

> 0

rollback

tran;go

-- ***********************************====

-- 建立測試資料庫

-- a. 刪除測試庫, 如果已經存在的話

ifdb_id

(n'db_xlock_test')is

notnull

begin;

alter

database

db_xlock_test

setsingle_user

with

rollback

after 0;

drop

database

db_xlock_test

;end;

-- b. 建立測試資料庫

create

database

db_xlock_test;

-- c. 關閉read_committed_snapshot 以保持select 的預設加鎖模式

alter

database

db_xlock_test

setread_committed_snapshot

off;go

-- ***********************************====

-- 建立測試表

usedb_xlock_test;go

create

table

dbo.tb(

idint

identity

primary

key,

name

sysname);

insert

dbo.

tbselect

top(50000)o1.

name

+n'.'+o2

.name

+n'.'+o3

.name

from

sys.

objects

o1with

(nolock

),sys

.objects

o2with

(nolock

),sys

.objects

o3with

(nolock

);go

然後,建立乙個連線,執行下面的指令碼來實現加鎖。

-- ***********************************====

-- 測試連線1 - 加鎖

begin

tran

--測試的初衷是通過select加鎖,結果發現update也鎖不住

update

dbo.

tbset

name

=name

--select count(*) from dbo.tb with(xlock)

where

id<= 2;

select

spid

=@@spid

,tran_count

=@@trancount

,database_name

=db_name

(),object_id

=object_id

(n'dbo.tb'

,n'table');

-- 顯示鎖exec

sp_lock

@@spid;

通過執行結果,可以看到物件被加鎖的情況:表級和頁級上是ix

鎖,記錄上是x鎖。

spid

tran_count

database_name

object_id51

1db_xlock_test

21575115

spid

dbid

objid

indid

type

resource

mode

status51

7 0

0 db

sgrant 51

721575115 1

pag0.095138889 ix

grant 51

721575115 0

tab

ix grant 51

11131151075 0

tab

is grant 51

721575115 1

key(020068e8b274) x

grant 51

721575115 1

key-10086470766 x

grant

然後新建乙個連線,執行下面的t-sql

查詢,看看會否被連線1鎖住

-- ***********************************====

-- 測試連線2 - 被阻塞(在測試連線1 執行後執行)

settransaction

isolation

level

read

committed

;select

*from

dbo.

tbwhere

id<= 2;

上述查詢會很快返回結果,並不會被查詢1

阻塞住。

按照我們的了解(聯機幫助上也有說明),在read committed

事務隔離級別下,查詢使用共享鎖(s

),而根據鎖的相容級別,s

鎖是與x

鎖衝突的,所以正常情況下,連線2

的查詢需要等待連線1

執行完成。可是測試的結果去違反了這一原則。

為了了解為什麼連線2

不會被阻塞,對連線2

做了乙個trace

,發現乙個更鬱悶的問題,trace

的結果如下:

eventclass

textdata

objectid

type

mode

lock:acquired

21575115

5 - object

6 - is

lock:acquired

1:77 0

6 - page

6 - is

lock:acquired

[planguide] 0

2 - database

3 - s

lock:acquired

21575115

5 - object

6 - is

lock:acquired

1:77 0

6 - page

6 - is

lock:acquired

1:80 0

6 - page

6 - is

lock:acquired

鎖不住的查詢

環境 sql server 2005 or 2008 最近在處理乙個鎖的問題時,發現乙個比較鬱悶的事,使用x 鎖居然無法鎖住查詢,模擬這個問題,可以使用如下t sql 指令碼來建立測試環境。usemaster go if trancount 0 rollback tran go 建立測試資料庫 a....

核心調校鎖不住頻率

酷安點評 核心調校裡提供的功能首先需要自己的核心相應的提供了修改的可能才可以使用,所以如果發現有很多描述到的功能無法使用的話,請先刷入第三方核心來進行體驗。相比其他同類應用來說,這個不僅外觀精美,而且還是開源的,對某些功能感覺不放心的話還可以檢視相關的原始碼 zesty 應用截圖 截圖預覽 關閉新版...

忍不住的胡思亂想

我有一千個理由放棄世界。卻沒有乙個理由擁有世界。因為我放棄了世界。世界也不再想來召喚我。我不想有被背叛的感覺。我發過許許多多的誓。卻沒有幾個成立的。無疑的。人是善變的。我不敢想象我會多麼的狼狽。也不願意想象。時間在不斷的流逝。我不知道自己在流逝的時間內乾了什麼。因為忘記了。有些事情是永恆的。但有些事...