sql server
的所有活動都會產生鎖。鎖定的單元越小,就越能越能提高併發處理能力,但是管理鎖的開銷越大。如何找到平衡點,使併發性和效能都可接受是
sql server
的難點。
sql server
有如下幾種瑣:1、
共享鎖用於唯讀操作
(select)
,鎖定共享的資源。共享鎖不會阻止其他使用者讀,但是阻止其他的使用者寫和修改。2、
更新鎖更新鎖是一種意圖鎖,當乙個事物已經請求共享瑣後並試圖請求乙個獨佔鎖的時候發生更新瑣。例如當兩個事物在幾行資料行上都使用了共享鎖,並同時試圖獲取獨佔鎖以執行更新操作時,就發生了死鎖:都在等待對方釋放共享鎖而實現獨佔鎖。更新鎖的目的是只讓乙個事物獲得更新鎖,防止這種情況的發生。3、
獨佔鎖一次只能有乙個獨佔鎖用在乙個資源上,並且阻止其他所有的鎖包括共享縮。寫是獨佔鎖,可以有效的防止』髒讀
』4、意圖縮
在使用共享鎖和獨佔鎖之前,使用意圖鎖。從表的層次上檢視意圖鎖,以判斷事物能否獲得共享鎖和獨佔鎖,提高了系統的效能,不需從爺或者行上檢查。5、
計畫鎖sch-m,sch-s
。對資料庫結構改變時用
sch-m
,對查詢進行編譯時用
sch-s
。這兩種鎖不會阻塞任何事物鎖,包括獨佔鎖。
讀是共享鎖,寫是排他鎖,先讀後更新的操作是更新鎖,更新鎖成功並且改變了資料時更新鎖公升級到排他鎖。鎖的型別有:
db-----
資料庫,由於
dbid
列已包含資料庫的資料庫
id,所以沒有提供任何資訊
fil----
檔案idx----
索引pg-----
頁,資料或索引頁。頁碼。頁由
fileid:page
組合進行標識,其中,
fileid
是sysfiles
表中的fileid
,而page
是該檔案內的邏輯頁碼。
key----鍵,
用於保護可序列事務中的鍵範圍
tab----
表,包括所有資料和索引在內的整個表。由於
objid
列已包含表的物件
id,所以沒有提供任何資訊
ext----
區域,
相鄰的八個資料頁或索引頁構成的一組。正被鎖定的擴充套件盤區中的第乙個頁碼。頁由
fileid:page
組合進行標識。
rid----
行,表內已鎖定行的行識別符號。行由
fileid:page:rid
組合進行標識,其中,
rid
是頁中的行識別符號。
鎖的狀態:
grant---
能使用被授權的資源
wait----
能使用被其他任務阻塞的資源
cnvrt---convert,
鎖正在被轉換
細分鎖的模式:
0 null
沒有得到資源的訪問許可權
1 sch-s (schema stability)
對查詢進行編譯時。能防止加鎖的物件被刪除直到解鎖
2 sch-m (schema modification)
改變資料庫結構時發生。能防止其他的事物訪問加鎖的物件
3 is (intent shares)
意圖共享鎖。
4 siu(share intent update)
意圖在維護資源的共享鎖時,把更新鎖放到鎖層次結構的下層資源上
5 is-s(intent share-shared)
復合鍵範圍鎖
6 ix(intent exclusive)
意圖排他鎖
7 six(share intent exclusive)
8 s(share)
共享鎖9 u(update)
更新鎖。防止死鎖
10 iin-nul(intent insert-null)
索引行層次的鎖定,復合鍵範圍鎖
11 is-x(intent share-exclusive)
12 iu(intent update)
意圖更新鎖
13 is-u(intent share update)
序列更新掃瞄
14 x(exclusive)
排他鎖15 bu
塊操作使用的鎖
所以有如下的結論。 1
、乙個連線在修改資料塊時別的連線不能修改這個資料塊,直到解鎖。
並行訪問是任何資料庫解決方案都最為重視的問題了,為了解決並行訪問方面的問題各類資料庫系統提出了各種各樣的方案。
sql server
採用了多執行緒機制,它當然能夠一次處理多個請求。不過,在使用者修改資料的情況下並行訪問問題就變得複雜起來了。顯然,資料庫通常只允許唯一使用者一次修改特定的資料。當某一使用者開始修改某塊資料時,
sql server
能很快地鎖定資料,阻止其他使用者對這塊資料進行更新,直到修改該資料的第一位使用者完成其操作並提交交易或者回滾。但是,當某一位使用者正在修改某塊資料時假設另一位使用者又正想查詢該資料的資訊時會發生什麼情況呢?
2、通常情況下,乙個連線在修改資料塊時別的連線也不能查詢這個資料塊,直到解鎖。反之亦然:讀的時候不能寫和修改。這個方案會降低系統的效能和效率,儘管現在是行級鎖(
7.0以前是鎖頁甚至是鎖表),如果你一次修改多行資料,
sql server
則會把資料鎖定範圍提公升到頁級別乃至鎖定整個資料表,從而不必針對每一記錄跟蹤和維護各自的資料鎖,這樣能加快修改的速度,消耗小的伺服器資源,但是併發性就差了。。
3、乙個連線寫的時候,另乙個連線可以寫,但是不得讀
4、多個連線可以同時讀同一行。
所以鎖發生在讀、寫的競爭上。 5
、設定事物的級別
set transaction isolation levela、
read committed
:指定在讀取資料時控制共享鎖以避免髒讀,但資料可在事務結束前更改,從而產生不可重複讀取或幻像資料。該選項是
sql server
的預設值。b、
read uncommitted
:執行髒讀或
0 級隔離鎖定,這表示不發出共享鎖,也不接受排它鎖。當設定該選項時,可以對資料執行未提交讀或髒讀;在事務結束前可以更改資料內的數值,行也可以出現在資料集中或從資料集消失。這是四個隔離級別中限制最小的級別。c、
repeatable read
:鎖定查詢中使用的所有資料以防止其他使用者更新資料,但是其他使用者可以將新的幻像行插入資料集,且幻像行包括在當前事務的後續讀取中。因為併發低於預設隔離級別,所以應只在必要時才使用該選項。d、
serializable
:在資料集上放置乙個範圍鎖,以防止其他使用者在事務完成之前更新資料集或將行插入資料集內。這是四個隔離級別中限制最大的級別。因為併發級別較低,所以應只在必要時才使用該選項。該選項的作用與在事務內所有
select
語句中的所有表上設定
holdlock
相同。
注釋一次只能設定這些選項中的乙個,而且設定的選項將一直對那個連線保持有效,直到顯式更改該選項為止。這是預設行為,除非在語句的
from
子句中在表級上指定優化選項。
set transaction isolation level
的設定是在執行或執行時設定,而不是在分析時設定。
python鎖機制 python的鎖機制
鎖 lock lock 指令鎖 是可用的最低階的同步指令。lock處於鎖定狀態時,不被特定的執行緒擁有。lock包含兩種狀態 鎖定和非鎖定,以及兩個基本的方法。可以認為lock有乙個鎖定池,當執行緒請求鎖定時,將執行緒至於池中,直到獲得鎖定後出池。池中的執行緒處於狀態圖中的同步阻塞狀態。構造方法 l...
SQL Server資料庫鎖機制及型別
microsoft sql server 以下簡稱sql server 作為一種中小型資料庫管理系統,已經得到了廣泛的應用,該系統更強調由系統來管理鎖。在使用者有sql請求時,系統分析請求,自動在滿足鎖定 條件和系統效能之間為資料庫加上適當的鎖,同時系統在執行期間常常自動進行優化處理,實行動態加鎖。...
python鎖機制 python 鎖機制
當有兩個或跟多個執行緒或程序需要操作乙個變數或程序時,會出現意想不到的結果,這是因為執行緒或程序時迸發進行的,對同意變數或檔案操作時,會出現同時對其操作,從到導致邏輯錯誤。bin usr env python coding utf 8 import multiprocessing import ti...