有關數據庫 行 鎖 的幾個問題(rowlock)


行鎖的基本說明:

SELECT au_lname FROM authors WITH (NOLOCK)

鎖定提示                                 描述  
HOLDLOCK        將共享鎖保留到事務完成,而不是在相應的表、行或數據頁不再需要時就立即釋放鎖。HOLDLOCK        等同於        SERIALIZABLE。        
NOLOCK        不要發出共享鎖,並且不要提供排它鎖。當此選項生效時,可能會讀取未提交的事務或一組在讀取中間回滾的頁面。有可能發生臟讀。僅應用於        
SELECT        語句。        
PAGLOCK        在通常使用單個表鎖的地方采用頁鎖。        
READCOMMITTED        用與運行在提交讀隔離級別的事務相同的鎖語義執行掃描。默認情況下,SQL        Server        
2000        在此隔離級別上操作。        
READPAST        跳過鎖定行。此選項導致事務跳過由其它事務鎖定的行(這些行平常會顯示在結果集內),而不是阻塞該事務,使其等待其它事務釋放在這些行上的鎖。READPAST        鎖提示僅適用於運行在提交讀隔離級別的事務,並且只在行級鎖之后讀取。僅適用於        
SELECT        語句。        
READUNCOMMITTED        等同於        NOLOCK。        
REPEATABLEREAD        用與運行在可重復讀隔離級別的事務相同的鎖語義執行掃描。        
ROWLOCK        使用行級鎖,而不使用粒度更粗的頁級鎖和表級鎖。        
SERIALIZABLE        用與運行在可串行讀隔離級別的事務相同的鎖語義執行掃描。等同於        HOLDLOCK。        
TABLOCK        使用表鎖代替粒度更細的行級鎖或頁級鎖。在語句結束前,SQL        Server        一直持有該鎖。但是,如果同時指定        
HOLDLOCK,那么在事務結束之前,鎖將被一直持有。        
TABLOCKX        使用表的排它鎖。該鎖可以防止其它事務讀取或更新表,並在語句或事務結束前一直持有。        
UPDLOCK        讀取表時使用更新鎖,而不使用共享鎖,並將鎖一直保留到語句或事務的結束。UPDLOCK        的優點是允許您讀取數據(不阻塞其它事務)並在以后更新數據,同時確保自從上次讀取數據后數據沒有被更改。        
XLOCK        使用排它鎖並一直保持到由語句處理的所有數據上的事務結束時。可以使用        PAGLOCK        或        TABLOCK        指定該鎖,這種情況下排它鎖適用於適當級別的粒度

 

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 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 * FROM table WITH (HOLDLOCK) 其他事務可以讀取表,但不能更新刪除  

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


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


A 連接中執行 

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ 

begin tran 

select * from tablename with (rowlock) where id=3 

waitfor delay '00:00:05' 

commit tran 

B連接中如果執行 

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

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

2 鎖定數據庫的一個表 

SELECT * FROM table WITH (HOLDLOCK)  


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

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

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM