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 的支援使得對響...