如何對錶、行、數據庫加鎖

1 如何鎖一個表的某一行 

SET TRANSACTION ISOLATION LEVELREAD UNCOMMITTED 

SELECT * FROMtable ROWLOCKWHERE id = 1 

2 鎖定數據庫的一個表 

SELECT * FROMtable WITH (HOLDLOCK

加鎖語句:
sybase:
update set col1=col1where 1=0 ;
MSSQL:
select col1from 表 (tablockx)where 1=0 ;
oracle:
LOCK
TABLEIN 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 table1holdlock -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 

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

補充一點:
Sql Server2000支持的表級鎖定提示 

HOLDLOCK 持有共享鎖,直到整個事務完成,應該在被鎖對象不需要時立即釋放,等於SERIALIZABLE事務隔離級別 

NOLOCK 語句執行時不發出共享鎖,允許髒讀 ,等於
READ UNCOMMITTED事務隔離級別 

PAGLOCK 在使用一個表鎖的地方用多個頁鎖 

READPAST 讓sql server跳過任何鎖定行,執行事務,適用於READ UNCOMMITTED事務隔離級別只跳過RID鎖,不跳過頁,區域和表鎖 

ROWLOCK 強制使用行鎖 

TABLOCKX 強制使用獨佔表級鎖,這個鎖在事務期間阻止任何其他事務使用這個表 

UPLOCK 強制在讀表時使用更新而不用共享鎖 

應用程序鎖:
應用程序鎖就是客戶端代碼生成的鎖,而不是sql server本身生成的鎖 

處理應用程序鎖的兩個過程 

sp_getapplock 鎖定應用程序資源 

sp_releaseapplock 爲應用程序資源解鎖 

注意: 鎖定數據庫的一個表的區別 

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

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


1 如何鎖一個表的某一行
/*
        測試環境:windows 2K server + Mssql 2000
        所有功能都進行測試過,並有相應的結果集,如果有什麼疑義在論壇跟帖
        關於版權的說明:部分資料來自互聯網,如有不當請聯繫版主,版主會在第一時間處理。
        功能:sql遍歷文件夾下的文本文件名,當然你修改部分代碼後可以完成各種文件的列表。
*/


A 連接中執行

SET TRANSACTION ISOLATION LEVELREPEATABLE READ

begin tran

select * from tablenamewith (rowlock)where id=3

waitfor delay'00:00:05'

commit tran

B連接中如果執行

update tablenameset colname='10'where id=3--則要等待5秒

update tablenameset colname='10'where id <>3--可立即執行

2 鎖定數據庫的一個表

SELECT * FROMtable WITH (HOLDLOCK


注意: 鎖定數據庫的一個表的區別

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

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

發佈了11 篇原創文章 · 獲贊 6 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章