數據庫鎖表是什麼意思?
oracle數據庫 鎖表和死鎖的區別
死鎖指的是a,b兩個事務對同一對象進行dml或ddl操作(即修改表結構或者增刪改數據),出現了相互等待被鎖定的對象的情況,即類似於紅綠燈十字路口紅燈方向堵住路口,綠燈方向卻紅燈車輛擋在路口不能過去,這樣無論紅綠燈如何變化都無法通行。一般像oracle這樣的dbms是有死鎖檢測的,然後把鎖定對象拋出來按照預定規則處理或者讓程序處理。 鎖等待指的是a事務鎖定了操作對象,而b事務也要對其進行dml或ddl操作(即修改表結構或者增刪改數據)時,需要等待a事務完成。這個和死鎖不同,只要a事務完成後,b事務就可以正常進行了。類似於正常的紅綠燈十字路口通行狀態:紅燈方向就是等待鎖釋放的b事務,綠燈方向就是鎖定路口的a事務。待紅綠燈互換,則a事務執行完畢,b事務也就可以正常執行啦。
MySQL鎖表是什麼意思?有什麼用?什麼情況下用?好處?缺點?
白話解說如下:
簡單說,就是lock table,不讓別人動
鎖分共享鎖和排它鎖。
共享鎖時,別人能讀,不能改變量表數據
排它鎖時,別人既不能讀,也不能改表數據
根據以上特點,應該就知道何時使用鎖了。不想讓別人變更數據,對自己產生影響,就加鎖。一定要在不用之後,進行鎖釋放,不然,應用系統會一直因為讀取數據而報錯。
好處就是,保證數據的原子性,完整性,一致性。 只有加鎖者釋放了鎖,別人才能改變數據。
缺點就是,增加了系統開銷,有可能產生鎖等待,造成數據庫運行異常。這都是不正常的使用鎖帶來的問題。
什麼情況下造成數據庫鎖表? 如何解決?
zhidao.baidu.com/question/180766896.html
兩個SQL的鎖表問題
不同的數據庫,多版本的實現機制不同,上述語句執行情況也就不一樣,下面以oracle為例說明:
1.insert/delete語句可以併發執行,不會鎖等待
2.併發insert不會鎖等待
3.併發update,如果不是操作同一條記錄,不會鎖等待
=================================================
對真實存在的數據進行併發操作才有可能發生寫衝突,所以樓主供要把握住這點就可以判斷是否會衝突了。
建議樓主構造簡單數據,開兩個客戶端,在不同的隔離級下去模擬併發操作,理論和實踐相結合,你會理解的更透徹。
oracle 數據庫 為什麼鎖表
簡單地說,鎖是為了保證數據的一致性,鎖不止存在於oracle,其他數據庫一樣有,只不過機制上可能大相徑庭。 至於什麼樣的操作會鎖表,其實鎖的種類很多,你所說的鎖表大概說的是行級鎖——也就是事務鎖吧
如何將數據庫中被鎖表解鎖
在操作數據庫的時候,有時候會由於操作不當引起數據庫表被鎖定,這麼我們經常不知所措,不知怎麼給這些表解鎖,在pl/sql Developer工具的的菜單“tools”裡面的“sessions”可以查詢現在存在的會話,但是我們很難找到那個會話被鎖定了,想找到所以被鎖的會話就更難了,下面這叫查詢語句可以查詢出所以被鎖的會話。如下:
SELECT sn.username, m.SID,sn.SERIAL#, m.TYPE,
DECODE (m.lmode,
0, 'None',
1, 'Null',
2, 'Row Share',
3, 'Row Excl.',
4, 'Share',
5, 'S/Row Excl.',
6, 'Exclusive',
lmode, LTRIM (TO_CHAR (lmode, '990'))
) lmode,
DECODE (m.request,
0, 'None',
1, 'Null',
2, 'Row Share',
3, 'Row Excl.',
4, 'Share',
5, 'S/Row Excl.',
6, 'Exclusive',
request, LTRIM (TO_CHAR (m.request, '990'))
) request,
m.id1, m.id2
FROM v$session sn, v$lock m
WHERE (sn.SID = m.SID AND m.request != 0) --存在鎖請求,即被阻塞
OR ( sn.SID = m.SID --不存在鎖請求,但是鎖定的對象被其他會話請求鎖定
AND m.request = 0
AND lmode != 4
AND (id1, id2) IN (
SELECT s.id1, s.id2
FROM v$lock s
WHERE request != 0 AND s.id1 = m.id1
AND s.id2 = m.id2)
)
ORDER BY id1, id2, m.request;
通過以上查詢知道了sid和 SERIAL#就可以開殺了
alter system kill session 'sid,SERIAL#';
怎麼知道數據庫表已經鎖表了
通過查詢結果中的object_id,可以查詢到具體被鎖的對象再給你看看我查到的一些關於鎖的資料:鎖有以下幾種模式: 0:none 1:null 空 2:Row-S 行共享(RS):共享表鎖 3:Row-X 行專用(RX):用於行的修改 4:Share 共享鎖(S):阻止其他DML操作 5:S/Row-X 共享行專用(SRX):阻止其他事務操作 6:exclusive 專用(X):獨立訪問使用數字越大鎖級別越高, 影響的操作越多。一般的查詢語句如select ... from ... ;是小於2的鎖, 有時會在v$locked_object出現。 select ... from ... for update; 是2的鎖。當對話使用for update子串打開一個遊標時,所有返回集中的數據行都將處於行級(Row-X)獨佔式鎖定,其他對象只能查詢這些數據行,不能進行update、delete或select...for update操作。 insert / update / delete ... ; 是3的鎖。沒有commit之前插入同樣的一條記錄會沒有反應, 因為後一個3的鎖會一直等待上一個3的鎖, 我們必須釋放掉上一個才能繼續工作。創建索引的時候也會產生3,4級別的鎖。 locked_mode為2,3,4不影響DML(insert,delete,update,select)操作, 但DDL(alter,drop等)操作會提示ora-00054錯誤。有主外鍵約束時 update / delete ... ; 可能會產生4,5的鎖。 DDL語句時是6的鎖。以DBA角色, 查看當前數據庫裡鎖的情況可以用如下SQL語句: select object_id,session_id,locked_mode from v$locked_object; select t2.username,t2.sid,t2.serial#,t2.logon_time from v$locked_object t1,v$session t2 where t1.session_id=t2.sid order by t2.logon_time; 如果有長期出現的一列,可能是沒有釋放的鎖。我們可以用下面SQL語句殺掉長期沒有釋放非正常的鎖: alter system kill session 'sid,serial#'; 如果出現了鎖的問題, 某個DML操作可能等待很久沒有反應。當你採用的是直接連接數據庫的方式,也不要用OS系統命令 $kill process_num 或者 $kill -9 process_num來終止用戶連接,因為一個用戶進程可能產生一個以上的鎖, 殺OS進程並不能徹底清除鎖的問題。
如何實現數據庫鎖表及解鎖
鎖表:
LOCK TABLES tablename WRITE;LOCK TABLES tablename READ;解鎖
UNLOCK TABLES;
數據庫中如何釋鎖表進程
鎖表查詢的代碼有以下的形式:
select count(*) from v$locked_object;
select * from v$locked_object;
查看哪個表被鎖
select b.owner,b.object_name,a.session_id,a.locked_mode from v$locked_object a,dba_objects b where b.object_id = a.object_id; 查看是哪個session引起的
select b.username,b.sid,b.serial#,logon_time from v$locked_object a,v$session b where a.session_id = b.sid order by b.logon_time; 殺掉對應進程
執行命令:alter system kill session'1025,41';
其中1025為sid,41為serial#.
怎麼知道數據庫表已經鎖表了
先回答你的問題:
select *from v$locked_object;
可以獲得被鎖的對象的object_id及產生鎖的會話sid。
通過查詢結果中的object_id,可以查詢到具體被鎖的對象
再給你看看我查到的一些關於鎖的資料:
鎖有以下幾種模式:
0:none
1:null 空
2:Row-S 行共享(RS):共享表鎖
3:Row-X 行專用(RX):用於行的修改
4:Share 共享鎖(S):阻止其他DML操作
5:S/Row-X 共享行專用(SRX):阻止其他事務操作
6:exclusive 專用(X):獨立訪問使用
數字越大鎖級別越高, 影響的操作越多。
一般的查詢語句如select ... from ... ;是小於2的鎖, 有時會在v$locked_object出現。
select ... from ... for update; 是2的鎖。
當對話使用for update子串打開一個遊標時,
所有返回集中的數據行都將處於行級(Row-X)獨佔式鎖定,
其他對象只能查詢這些數據行,不能進行update、delete或select...for update操作。
insert / update / delete ... ; 是3的鎖。
沒有commit之前插入同樣的一條記錄會沒有反應,
因為後一個3的鎖會一直等待上一個3的鎖, 我們必須釋放掉上一個才能繼續工作。
創建索引的時候也會產生3,4級別的鎖。
locked_mode為2,3,4不影響DML(insert,delete,update,select)操作,
但DDL(alter,drop等)操作會提示ora-00054錯誤。
有主外鍵約束時 update / delete ... ; 可能會產生4,5的鎖。
DDL語句時是6的鎖。
以DBA角色, 查看當前數據庫裡鎖的情況可以用如下SQL語句:
select object_id,session_id,locked_mode from v$locked_object;
select t2.username,t2.sid,t2.serial#,t2.logon_time
from v$locked_object t1,v$session t2
where t1.session_id=t2.sid order by t2.logon_time;
如果有長期出現的一列,可能是沒有釋放的鎖。
我們可以用下面SQL語句殺掉長期沒有釋放非正常的鎖:
alter system kill session 'sid,serial#';
如果出現了鎖的問題, 某個DML操作可能等待很久沒有反應。
當你採用的是直接連接數據庫的方式,
也不要用OS系統命令 $kill process_num 或者 $kill -9 process_num來終止用戶連接,
因為一個用戶進程可能產生一個以上的鎖, 殺OS進程並不能徹底清除鎖的問題。
記得在數據庫級別用alter system kill session 'sid,serial#';殺掉不正常的鎖。
這裡還講了一些:
......