環境: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 應用截圖 截圖預覽 關閉新版...
忍不住的胡思亂想
我有一千個理由放棄世界。卻沒有乙個理由擁有世界。因為我放棄了世界。世界也不再想來召喚我。我不想有被背叛的感覺。我發過許許多多的誓。卻沒有幾個成立的。無疑的。人是善變的。我不敢想象我會多麼的狼狽。也不願意想象。時間在不斷的流逝。我不知道自己在流逝的時間內乾了什麼。因為忘記了。有些事情是永恆的。但有些事...