SqlServer中的鎖

来源:https://www.cnblogs.com/superfeeling/archive/2022/06/10/16364891.html
-Advertisement-
Play Games

近十年來,中國基礎軟體發展勢頭迅猛,市場前景看高,越來越多的企業也正在進行基礎軟體升級。那中國基礎軟體行業目前在國際市場上有什麼優勢,面臨哪些困境,以及未來基礎軟體行業會如何發展呢?騰訊雲資料庫邀請沙利文中國高級分析師胡竣傑、華雲中盛資料庫事業部總經理楊光、中軟國際資料庫業務總監範利軍及騰訊雲資料庫 ...


一. 為什麼要引入鎖

多個用戶同時對資料庫的併發操作時會帶來以下數據不一致的問題。

二、鎖的分類

(1) 從資料庫系統的角度來看

鎖分為以下三種類型:
* 獨占鎖(Exclusive Lock)(排它鎖)
獨占鎖鎖定的資源只允許進行鎖定操作的程式使用,其它任何對它的操作均不會被接受。執行數據更新命令,即INSERT、 UPDATE 或DELETE 命令時,SQL Server 會自動使用獨占鎖。但當對象上有其它鎖存在時,無法對其加獨占鎖。獨占鎖一直到事務結束才能被釋放。
* 共用鎖(Shared Lock)
共用鎖鎖定的資源可以被其它用戶讀取,但其它用戶不能修改它。在SELECT 命令執行時,SQL Server 通常會對對象進行共用鎖鎖定。通常加共用鎖的數據頁被讀取完畢後,共用鎖就會立即被釋放。
* 更新鎖(Update Lock)
更新鎖是為了防止死鎖而設立的。當SQL Server 準備更新數據時,它首先對數據對象作更新鎖鎖定,這樣數據將不能被修改,但可以讀取。等到SQL Server 確定要進行更新數據操作時,它會自動將更新鎖換為獨占鎖。但當對象上有其它鎖存在時,無法對其作更新鎖鎖定。

(2)從程式員的角度看

鎖分為以下兩種類型:
* 樂觀鎖(Optimistic Lock)
樂觀鎖假定在處理數據時,不需要在應用程式的代碼中做任何事情就可以直接在記錄上加鎖、即完全依靠資料庫來管理鎖的工作。一般情況下,當執行事務處理時SQL Server會自動對事務處理範圍內更新到的表做鎖定。
* 悲觀鎖(Pessimistic Lock)
悲觀鎖對資料庫系統的自動管理不感冒,需要程式員直接管理數據或對象上的加鎖處理,並負責獲取、共用和放棄正在使用的數據上的任何鎖。

(3)從鎖的粒度看

鎖是加在資料庫對象上的。而資料庫對象是有粒度的,比如同樣是1這個單位,1行,1頁,1個B樹,1張表所含的數據完全不是一個粒度的。因此,所謂鎖的粒度,是鎖所在資源的粒度。

Microsoft SQL Server 資料庫引擎具有多粒度鎖定,允許一個事務鎖定不同類型的資源。 為了儘量減少鎖定的開銷,資料庫引擎自動將資源鎖定在適合任務的級別。 鎖定在較小的粒度(例如行)可以提高併發度,但開銷較高,因為如果鎖定了許多行,則需要持有更多的鎖。 鎖定在較大的粒度(例如表)會降低了併發度,因為鎖定整個表限制了其他事務對錶中任意部分的訪問。 但其開銷較低,因為需要維護的鎖較少。

資源 說明
RID 用於鎖定堆中的單個行的行標識符。
KEY 索引中用於保護可序列化事務中的鍵範圍的行鎖。
PAGE 資料庫中的8KB頁,例如數據頁或索引頁。
EXTENT 一組連續的八頁,例如數據頁或索引頁。
HoBT 堆或B樹。用於保護沒有聚集索引的表中的B樹(索引)或堆數據頁的鎖。
TABLE 包括所有數據和索引的整個表。
FILE 資料庫文件。
APPLICATION 應用程式專用的資源。
METADATA 元數據鎖。
ALLOCATION_UNIT 分配單元。
DATABASE 整個資料庫。

三、sqlserver提供的表級鎖

sqlserver所指定的表級鎖定提示有如下幾種 

1. HOLDLOCK: 在該表上保持共用鎖,直到整個事務結束,而不是在語句執行完立即釋放所添加的鎖。

2. NOLOCK:不添加共用鎖和排它鎖,當這個選項生效後,可能讀到未提交讀的數據或“臟數據”,這個選項僅僅應用於SELECT語句。

3. PAGLOCK:指定添加頁鎖(否則通常可能添加表鎖)

4. READCOMMITTED用與運行在提交讀隔離級別的事務相同的鎖語義執行掃描。預設情況下,SQL Server 2000 在此隔離級別上操作。

5. READPAST: 跳過已經加鎖的數據行,這個選項將使事務讀取數據時跳過那些已經被其他事務鎖定的數據行,而不是阻塞直到其他事務釋放鎖,READPAST僅僅應用於READ COMMITTED隔離性級別下事務操作中的SELECT語句操作

6. READUNCOMMITTED:等同於NOLOCK。

7. REPEATABLEREAD:設置事務為可重覆讀隔離性級別。

8. ROWLOCK:使用行級鎖,而不使用粒度更粗的頁級鎖和表級鎖。

9. SERIALIZABLE:用與運行在可串列讀隔離級別的事務相同的鎖語義執行掃描。等同於 HOLDLOCK。

10. TABLOCK:指定使用表級鎖,而不是使用行級或頁面級的鎖,SQL Server在該語句執行完後釋放這個鎖,而如果同時指定了HOLDLOCK,該鎖一直保持到這個事務結束。

11. TABLOCKX:指定在表上使用排它鎖,這個鎖可以阻止其他事務讀或更新這個表的數據,直到這個語句或整個事務結束。

12. UPDLOCK :指定在讀表中數據時設置更新鎖(update lock)而不是設置共用鎖,該鎖一直保持到這個語句或整個事務結束,使用UPDLOCK的作用是允許用戶先讀取數據(而且不阻塞其他用戶讀數據),並且保證在後來再更新數據時,這一段時間內這些數據沒有被其他用戶修改

SELECT * FROM table WITH (HOLDLOCK) 其他事務可以讀取表,但不能更新刪除

SELECT * FROM table WITH (TABLOCKX) 其他事務不能讀取表,更新和刪除

四、sql (server) 行鎖,表鎖案例

--設table1(A,B,C) 
A B C 
a1 b1 c1 
a2 b2 c2 
a3 b3 c3

1)排它鎖 tablockx

新建兩個連接
在第一個連接中執行以下語句

begin tran 
update table1 set A='aa' where B='b2' 
waitfor delay '00:00:30' --等待30秒 
commit tran

在第二個連接中執行以下語句

begin tran 
select * from table1 where B='b2' 
commit tran 

若同時執行上述兩個語句,則select查詢必須等待update執行完畢才能執行即要等待30秒

2)共用鎖

在第一個連接中執行以下語句

begin tran 
select * from table1 holdlock -holdlock  人為加鎖 
where B='b2' 
waitfor delay '00:00:30' --等待30秒 
commit tran 

在第二個連接中執行以下語句

begin tran 
select A,C from table1 where B='b2' 
update table1 set A='aa' where B='b2' 
commit tran

若同時執行上述兩個語句,則第二個連接中的select查詢可以執行
而update必須等待第一個事務釋放共用鎖轉為排它鎖後才能執行 即要等待30秒

3)死鎖

--增設table2(D,E) 
D E 
d1 e1 
d2 e2

在第一個連接中執行以下語句

begin tran 
update table1 set A='aa' where B='b2' 
waitfor delay '00:00:30' 
update table2 set D='d5' where E='e1' 
commit tran

在第二個連接中執行以下語句

begin tran 
update table2 set D='d5' where E='e1' 
waitfor delay '00:00:10' 
update table1 set A='aa' where B='b2' 
commit tran

同時執行,系統會檢測出死鎖,並中止進程

 

參考:

https://www.php.cn/mysql-tutorials-123100.html

https://blog.csdn.net/softuse/article/details/121940804

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 好久沒到園子裡面逛了,回來看了看,.NET有點式微呀?Java/Spring/Linux……比以前多了很多,為什麼?博客園可是.NET的大本營了呀! 好吧,我承認,飛哥也動搖了,去年在ASP.NET的基礎上,開了一期Java Web班。給大家彙報一下心得體會吧: 錄課程前 其實我最開始學(2008年 ...
  • 【SignalR全套系列】之在.Net Core 中實現SignalR實時通信 ...
  • Cgroup Freezer cgroup freezer對於批量啟動和停止任務集合的任務管理系統來說是很有用的,這個程式經常被用在HPC族上來調度訪問。cgroup freezer使用cgroups來描述被批處理任務管理系統啟動和停止的任務集合。他也提供了方法來啟動和停止任務。 cgroup fr ...
  • Block IO Controller 1 概覽 cgroup子系統blkio實現了block io控制器。無論是對存儲結構上的葉子節點和還是中間節點,它對各種IO控制策略(proportional BW, max BW)都是必須的。設計規劃就是使用同樣的cgroup,基於blkio控制器的管理介面 ...
  • 鏡像下載、功能變數名稱解析、時間同步請點擊 阿裡雲開源鏡像站 一:虛擬機宿主機互ping不通 問題一:防火牆 略去,建議主機和宿主機都關閉防火牆,並關閉seLinux(Linux的安全系統) 問題二:網卡未生效 表現 輸入命令 ifcongig,若輸出的網卡信息不含inet [ip地址],則說明網卡未生效 ...
  • 鏡像下載、功能變數名稱解析、時間同步請點擊 阿裡雲開源鏡像站 由於我使用ubuntu20.04的火狐瀏覽器時,總是播放不了視頻。說是要下載Flash,但是我順著網址進去,發現並沒有linux版本的(也可能是我沒找到而已?)。於是一直放著沒管,看不了就看不了,真要看我就用筆記本的win10看好了。但是偶爾看到 ...
  • 本文參考書:操作系統真像還原 什麼是malloc? malloc 是用戶態申請記憶體時使用的函數。 malloc在哪裡申請? 堆中。 什麼是堆? 程式運行過程中需要申請額外的記憶體都會在堆中分配,堆中的記憶體分為幾個規格類型的塊用鏈表保存,程式需要記憶體就分配一個大於等於所需記憶體大小的塊。如果一個規格的塊用 ...
  • 資料庫概述 資料庫的概念 名稱 簡稱 資料庫 DataBase(DB) 資料庫管理系統 DataBase Management System(DBMS) SQL Structured Query Language(SQL) MySQL的啟動、停止 啟動: net start mysql80 停止: ...
一周排行
    -Advertisement-
    Play Games
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...
  • 目錄前言PostgreSql安裝測試額外Nuget安裝Person.cs模擬運行Navicate連postgresql解決方案Garnet為什麼要選擇Garnet而不是RedisRedis不再開源Windows版的Redis是由微軟維護的Windows Redis版本老舊,後續可能不再更新Garne ...
  • C#TMS系統代碼-聯表報表學習 領導被裁了之後很快就有人上任了,幾乎是無縫銜接,很難讓我不想到這早就決定好了。我的職責沒有任何變化。感受下來這個系統封裝程度很高,我只要會調用方法就行。這個系統交付之後不會有太多問題,更多應該是做小需求,有大的開發任務應該也是第二期的事,嗯?怎麼感覺我變成運維了?而 ...
  • 我在隨筆《EAV模型(實體-屬性-值)的設計和低代碼的處理方案(1)》中介紹了一些基本的EAV模型設計知識和基於Winform場景下低代碼(或者說無代碼)的一些實現思路,在本篇隨筆中,我們來分析一下這種針對通用業務,且只需定義就能構建業務模塊存儲和界面的解決方案,其中的數據查詢處理的操作。 ...
  • 對某個遠程伺服器啟用和設置NTP服務(Windows系統) 打開註冊表 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer 將 Enabled 的值設置為 1,這將啟用NTP伺服器功 ...
  • title: Django信號與擴展:深入理解與實踐 date: 2024/5/15 22:40:52 updated: 2024/5/15 22:40:52 categories: 後端開發 tags: Django 信號 松耦合 觀察者 擴展 安全 性能 第一部分:Django信號基礎 Djan ...
  • 使用xadmin2遇到的問題&解決 環境配置: 使用的模塊版本: 關聯的包 Django 3.2.15 mysqlclient 2.2.4 xadmin 2.0.1 django-crispy-forms >= 1.6.0 django-import-export >= 0.5.1 django-r ...
  • 今天我打算整點兒不一樣的內容,通過之前學習的TransformerMap和LazyMap鏈,想搞點不一樣的,所以我關註了另外一條鏈DefaultedMap鏈,主要調用鏈為: 調用鏈詳細描述: ObjectInputStream.readObject() DefaultedMap.readObject ...
  • 後端應用級開發者該如何擁抱 AI GC?就是在這樣的一個大的浪潮下,我們的傳統的應用級開發者。我們該如何選擇職業或者是如何去快速轉型,跟上這樣的一個行業的一個浪潮? 0 AI金字塔模型 越往上它的整個難度就是職業機會也好,或者說是整個的這個運作也好,它的難度會越大,然後越往下機會就會越多,所以這是一 ...
  • @Autowired是Spring框架提供的註解,@Resource是Java EE 5規範提供的註解。 @Autowired預設按照類型自動裝配,而@Resource預設按照名稱自動裝配。 @Autowired支持@Qualifier註解來指定裝配哪一個具有相同類型的bean,而@Resourc... ...