成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

SQL Server 的 Nolock 到底是怎樣的無鎖

數(shù)據(jù)庫 SQL Server
相信絕大部分用 SQLSERVER 作為底層存儲的程序員都知道 nolock? 關(guān)鍵詞,即使當(dāng)時不知道也會在踩過若干阻塞坑?之后果斷的加上 nolock,但這玩意有什么注意事項呢?這就需要了解它的底層原理了。

一、背景

1. 講故事

相信絕大部分用 SQLSERVER 作為底層存儲的程序員都知道 nolock 關(guān)鍵詞,即使當(dāng)時不知道也會在踩過若干阻塞坑之后果斷的加上 nolock,但這玩意有什么注意事項呢?這就需要了解它的底層原理了。

二、nolock 的原理

1. sql 阻塞還原

為了方便講述,先創(chuàng)建一個 post 表,插個 6 條記錄,參考代碼如下:

CREATE TABLE post(id INT IDENTITY,content char(4000))
GO

INSERT INTO dbo.post VALUES('aaa')
INSERT INTO dbo.post VALUES('bbb')
INSERT INTO dbo.post VALUES('ccc');
INSERT INTO dbo.post VALUES('ddd');
INSERT INTO dbo.post VALUES('eee');
INSERT INTO dbo.post VALUES('fff');

這里為了簡單我沒有創(chuàng)建索引,所以會出現(xiàn) Table Scan 的情況,畢竟生產(chǎn)環(huán)境下的sql也避免不了 Table Scan 和 Clustered Index Scan 的存在,接下來還原下阻塞場景,開啟兩個 session 會話, session1 為正在運行的 update 事務(wù), session2 為一個簡單的 select 操作,這種場景下會導(dǎo)致 session2 阻塞,參考代碼如下:

  • session1
BEGIN TRAN
UPDATE post SET content='xxxxx' WHERE id=3
  • session2
SELECT * FROM post WHERE id=4

圖片

從圖中可以看到,這個 select 已經(jīng)阻塞 9 分鐘了,那為什么會被阻塞呢?可以觀察 SQLSERVER 內(nèi)部的統(tǒng)計信息,比如鎖相關(guān)的動態(tài)視圖 sys.dm_tran_locks ,參考代碼如下:

SELECT t.request_session_id,
CASE
WHEN t.resource_type = 'OBJECT' THEN
OBJECT_NAME(t.resource_associated_entity_id)
WHEN t.resource_associated_entity_id = 0 THEN
'/'
ELSE
OBJECT_NAME(p.object_id)
END AS resource_name,
index_id,
t.resource_type,
t.resource_description AS description,
t.request_mode AS mode,
t.request_status AS status
FROM sys.dm_tran_locks AS t
LEFT JOIN sys.partitions AS p
ON p.hobt_id = t.resource_associated_entity_id
WHERE t.resource_database_id = DB_ID()

圖片

從圖中看,session55 準(zhǔn)備在 1:489:0 這個槽位指向的記錄上附加 S 鎖時被阻塞,因為 1:489:0 已經(jīng)被附加了 X 鎖,很顯然這個 X 鎖是 update 給的。

上面給出的是一個 靜態(tài)視圖,為了方便顯示動態(tài)視圖,這里把 sql profile 開起來觀察兩個 session 給鎖的過程,事件選擇上如下所示:

圖片

將 sqlprofile 開啟后,重新運行下剛才的兩個會話,觀察 profile 的走勢,截圖如下:

圖片

圖中的注釋已經(jīng)說的非常清楚了,和 sys.dm_tran_locks 顯示的一致,有了這些基礎(chǔ)后接下來觀察下如果加上 with (nolock) 會怎么樣?

SELECT * FROM post(NOLOCK) WHERE id=4

你會發(fā)現(xiàn)結(jié)果是可以出來的,那為什么可以出來呢?繼續(xù)觀察下 profile 即可。

圖片

從 session 55 的 lock 輸出來看,with(nolock) 會對 post 表附加 Sch-S 架構(gòu)穩(wěn)定鎖,以及分區(qū)中的 堆或BTree 附加S鎖, 而不再對 PAGE 附加任何鎖了,所以就不存在阻塞的情況,但肯定會引起臟讀。

到這里基本上就是 nolock 的底層玩法了吧,不過也有一個注意點,nolock 真的不會引發(fā)阻塞嗎? 接下來我們好好聊一聊。

3. nolock 真的無視阻塞嗎

從 sqlprofile 觀察鎖的走勢圖來看,nolock 只是在上限為 page 頁級別上做到無視,但在 page 之上就無法做到了,比如你看到的 Sch-S,可能有些朋友要問了,為什么要加上 Sch-S 鎖呢?其實很簡單,在 query 的過程中一定要保持架構(gòu)穩(wěn)定嘛,不能在 query 的過程中,post 表突然被刪了,這樣大家多尷尬。

接下來也可以做個簡單的測試。

----- session 1
BEGIN TRAN
TRUNCATE TABLE post;

----- session 2
SELECT * FROM post(NOLOCK) WHERE id=4

圖片

可以發(fā)現(xiàn) nolock 查詢也被阻塞了,原因就在于拿不到 post 表的 Sch-S 鎖,因為 TRUNCATE 已經(jīng)給 post 附加了 Sch-M 架構(gòu)修改鎖,那有沒有數(shù)據(jù)支撐呢?繼續(xù)用動態(tài)視圖 sys.dm_tran_locks 觀察便可。

圖片

三、總結(jié)

綜上所述,nolock 也僅在 page 級別上暢通無阻,在某些情況下也會有阻塞情況的發(fā)生,由于無鎖自然就會讀到別的會話已修改但還未提交的記錄,sqlserver 作為一個數(shù)據(jù)庫應(yīng)用程序,里面包含了大量的運行時統(tǒng)計信息,這些統(tǒng)計信息可以用 系統(tǒng)視圖 和 動態(tài)視圖 獲取,完全可以基于它們做一個完善的 APM 監(jiān)控。

責(zé)任編輯:武曉燕 來源: 一線碼農(nóng)聊技術(shù)
相關(guān)推薦

2021-05-06 16:15:12

Java代碼

2022-01-28 00:00:42

高并發(fā)線程順序

2020-05-28 18:30:59

5G網(wǎng)絡(luò)通信

2020-09-21 15:16:09

大數(shù)據(jù)IT技術(shù)

2018-07-13 15:15:09

2024-05-13 12:44:00

InnodbMySQL行級鎖

2024-02-22 08:00:00

SoraOpenAI

2022-08-08 08:00:00

人工智能機器學(xué)習(xí)計算機應(yīng)用

2021-10-13 06:49:13

SQL Server優(yōu)化

2017-10-16 08:38:16

2024-03-15 08:06:58

MySQLJOIN命令

2022-05-24 17:00:41

區(qū)塊鏈IT比特幣

2010-04-02 16:46:43

云計算

2013-04-24 09:08:17

Google眼鏡

2019-05-28 13:50:27

MySQL幻讀數(shù)據(jù)庫

2020-08-19 07:48:11

云計算亞馬遜搜索

2018-05-03 15:03:09

內(nèi)存虛擬化空間

2021-08-13 05:47:48

通信設(shè)計院通信行業(yè)設(shè)計院

2022-08-12 08:03:59

算力網(wǎng)絡(luò)算力網(wǎng)絡(luò)

2023-12-15 07:23:39

電子管半導(dǎo)體芯片集成電路
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 一区二区三区四区国产 | 日韩免费高清视频 | 天天干天天爱天天操 | 亚洲精品一区在线 | 欧美久久一级特黄毛片 | 在线āv视频 | 久久九七| 美女人人操 | 日韩精品视频在线观看一区二区三区 | 国产精品毛片一区二区三区 | 日韩一区二区在线视频 | 成人av电影在线 | 亚洲免费一区 | 欧美九九 | 中文字幕精品一区二区三区精品 | 91在线看| 久久久无码精品亚洲日韩按摩 | 91视频在线 | 精品一区视频 | 久久久久久亚洲国产精品 | 欧美专区在线 | 国产精品久久久99 | 久久亚洲一区二区 | 精品一区二区久久久久久久网站 | 中文字幕日本一区二区 | 亚洲 中文 欧美 日韩 在线观看 | 欧美一a一片一级一片 | 日韩高清中文字幕 | 欧美成人一区二区三区 | 在线观看国产 | 精品在线一区 | 成年人网站免费 | 国产精品久久久久久久久久妇女 | 毛片链接 | 狠狠做深爱婷婷综合一区 | 日本在线精品视频 | 国产欧美一区二区三区在线看蜜臀 | 亚洲欧美精品在线 | 精品久久香蕉国产线看观看亚洲 | 日本一级淫片免费啪啪3 | 噜啊噜在线 |