前幾天看過資料庫鎖的介紹,當時雖說看完了,似懂非懂,還記得有次筆試題目,估計也錯了,
最近看過高併發性的資料維護課程後,現在翻看鎖基礎,豁然開朗,現整理筆記,及個人理解
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個共享鎖 否...