資料庫鎖基礎

2021-04-26 05:32:37 字數 2896 閱讀 9009

前幾天看過資料庫鎖的介紹,當時雖說看完了,似懂非懂,還記得有次筆試題目,估計也錯了,

最近看過高併發性的資料維護課程後,現在翻看鎖基礎,豁然開朗,現整理筆記,及個人理解

sql2005鎖隔離級別有4種,read uncommit ,read commit,repeatable read 可重複讀,

serializable 序列讀,

read uncommit:讀未提交,與nolock一樣,允許髒讀資料,其中nolock查詢執行不發出共享鎖,

與其他操作可共存

read commit:讀提交級別,不會產生髒讀,但產生不可重複讀,,如果乙個事務裡面兩次讀取同一結果集,

在兩次讀取中間被更改的話,兩次讀取結果會不同,不會鎖住其他更新,

repeatable read:能達到重複讀取數值,但不能解決其他操作插入,刪除表的值,造成幻影現象,

其他操作要等到重複讀鎖完成,事務提交後,才能進行更新,刪除,插入操作,但可以查尋

serializable: 可序列讀,是鎖定要求最高的級別,其他操作的查詢,更新,等操作都不能進行,

直到該級別操作 完成,事務提交

幾種型別: holdlock,選項保持住鎖,即使查詢完成也不釋放,相當於儲存共享s鎖,

tablocks,獨佔鎖,nolock 不發出共享鎖

rowlock,行鎖,pagelock 頁鎖,tablock 表鎖,uplock,更新鎖

共享鎖=s鎖,更新鎖=u鎖,排它鎖=x鎖,意向共享鎖=is鎖,意向更新鎖=iu鎖,意向排它共享鎖=six鎖

架構鎖=sch-s

鎖的粒度:

1:行鎖

2:頁鎖

3:鍵:

4:擴充套件盤區

5:表,資料庫

設定鎖級別語句:

set transaction isolation level read commit

黏貼測試例子:

1 如何鎖乙個表的某一行

set transaction isolation level read uncommitted

select * from table rowlock where id = 1 2

鎖定資料庫的乙個表

select * from table with (holdlock)

加鎖語句:

sybase:

update

表set col1=col1 where 1=0 ;

mssql:

select col1 from

表(tablockx) where 1=0

oracle:

lock table

表in exclusive mode

;加鎖後其它人不可操作,直到加鎖使用者解鎖,用

commit

或rollback解鎖

幾個例子幫助大家加深印象

設table1(a,b,c)

a b c

a1 b1 c1

a2 b2 c2

a3 b3 c3

1)排它鎖

新建兩個連線

在第乙個連線中執行以下語句

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 ed1 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

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

資料庫(2)資料庫鎖

這一段時間一直在學習關係型資料庫,準備寫乙個小專題來總結一下這一段時間的學習結果。二.事物隔離等級和鎖的關係 網上很多部落格都是直接說了一連串的鎖,什麼悲觀鎖樂觀鎖,什麼讀寫鎖,什麼排他鎖共享鎖。說的不僅語焉不詳,而且分類紊亂,希望看到這篇文章能幫助你理清思路。從鎖的實現方式來看,鎖可以分為悲觀鎖和...

mysql資料庫鎖 MySQL資料庫的鎖機制

在併發訪問情況下,很有可能出現不可重複讀等等讀現象。為了更好的應對高併發,封鎖 時間戳 樂觀併發控制 樂觀鎖 悲觀併發控制 悲觀鎖 都是併發控制採用的主要技術方式。鎖分類 按操作劃分 dml鎖,ddl鎖 按鎖的粒度劃分 表級鎖 行級鎖 頁級鎖 按鎖級別劃分 共享鎖 排他鎖 按加鎖方式劃分 自動鎖 顯...

資料庫鎖機制

這段時間由於開發專案,重新學習了資料庫的併發控制和鎖機制。資料庫就是通過鎖機制來解決併發問題的。主要就是兩種鎖,共享鎖和排他鎖 也叫獨佔鎖 在執行select語句的時候需要給操作物件 表或者一些記錄 加上共享鎖,但加鎖之前需要檢查是否有排他鎖,如果沒有,則可以加共享鎖 乙個物件上可以加n個共享鎖 否...