資料庫表 行 資料庫鎖定

2021-06-29 02:06:18 字數 3978 閱讀 1139

1如何鎖乙個表的某一行  

settransaction

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本身生成的鎖  

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

注意: 鎖定資料庫的乙個表的區別  

select

*from

table

with (

holdlock) 其他事務可以讀取表,但不能更新刪除  

select

*from

table

with (tablockx) 其他事務不能讀取表,更新和刪除  

1如何鎖乙個表的某一行  /*

*/a 連線中執行 

settransaction

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)  

其他事務不能讀取表,更新和刪除

資料庫鎖定

在很多客戶一起查詢資料表時,如果使客戶能最快地查詢到資料就是排程和鎖定做的工作了。在mysql中,我們把select操作叫做讀,把對資料表修改增加的操作 insert,update,replace.叫做寫。mysql的基本排程策略可以歸納為以下兩條 寫入請求將按它們到達伺服器的順序進行處理 寫操作的...

MySQL鎖定資料庫表

mysql中所有鎖定不會是死鎖的。這通過總是在乙個查詢前立即請求所有必要的鎖定並且總是以同樣的順序鎖定表來管理。對write,mysql使用的鎖定方法原理如下 對read,mysql使用的鎖定方法原理如下 當乙個鎖定被釋放時,鎖定可被寫鎖定佇列中的執行緒得到,然後是讀鎖定佇列中的執行緒。這意味著,如...

並行資料庫

計算機系統效能 比的不斷提高迫切要求硬體 軟體結構的改進。硬體方面,單純依靠提高微處理器速度和縮小體積來提高效能 比的方法正趨於物理極限 磁碟技術的發展滯後於微處理器的發展速度,使得磁碟 i o 頸瓶問題日益突出。軟體方面,資料庫伺服器對大型資料庫各種複雜查詢和聯機事務處理 oltp 的支援使得對響...