一、鎖分為
enqueuse --- 佇列型別的鎖,通常和業務相關,
latches --- 系統資源方面的鎖,比如記憶體結構,sql解析等。。。
二、鎖的原則
只有被修改時,行才會鎖定。
當一條語句修改了一條記錄,只有這條記錄上被鎖定,在oracle中不存在鎖上公升,不會由原來的表鎖上公升到表鎖。
當某行被修改時,他將阻塞別人修改他。
當乙個事物修改一行時,他將在這一行上加上乙個行鎖(tx),用於阻止其他事物對相同行的修改。
讀永遠不會阻止寫,除非select ...for update,同樣寫也不會阻止讀,當一行被修改後,但是沒有提交,由會滾段提供資料的一致性讀。
當要修改某張表的一行資料,oracle會在這張表上加兩個鎖,乙個tm表鎖,乙個tx行鎖,新增表tm鎖的原因是不能讓其他的事物去刪除這張表。
注釋:查詢當前session的sid ;
select distinct sid from v$mystat;
update例子:
1.t表裡只有一條資料,並且id欄位是主鍵
2.對id=1進行修改,不提交
3.新開乙個視窗,再次對這個id=1 進行修改
4.查詢鎖檢視v$lock
type:鎖的型別
sid:回話的sid
lomde:3號模式鎖是共享鎖,誰都能給他加這個鎖,6是排它鎖只有我可以用,模式有2、3、4、5、6這幾種。
request:去請求什麼鎖,這裡可以看出sid為38的在請求乙個排他的事物鎖(行鎖tx)
block:有沒有阻塞別人,這裡可以看出sid為1的已經阻塞了別人。
現在我們去看下等待事件v$session_wait;
這裡可以看出sid為38的產生了等待,enq就是上面我們說的enqueuse型別,原因是事物鎖(tx鎖等待)
delete鎖的情況和update一樣。
insert 例子:
insert相對於update和delete是有區別的,update和delete操作的是同樣的一條資料(比如id=1 就是這條資料)
1.現在表裡只有一條資料
2.增加一條
3.另乙個視窗,在增加一條,產生了等待。
4.檢視v$lock
這裡就和update不一樣了,sid為1的阻塞了sid為38的會話,但是sid為38的比之前多了一行,他已經獲取到了模式為6的事物鎖(tx),update和delete操作的是同樣的一條資料(比如id=1 就是這條資料),insert 是往裡面插資料,不是update那種的同一條資料。他去請求模式為4的事物鎖。
在資料庫中模式越大,鎖的等級越高,6是限制性最強的。
鎖的互斥關係
上圖中 鎖定的sql一列可以手工加上去的,t是表名。
類值類與類指標類
類值類 行為像值的 class a a const a a ps new string a.ps i a.i 每個類物件有自己的乙份資源拷貝 a operator const a rhs a private string ps int i 一種優化拷貝賦值運算子的方法 copy and swap c...
巢狀類 匿名類 密封類
巢狀類 在c 中可以將乙個類定義在另乙個類的內部,外部的叫外部類,內部的巢狀類 namespace 27 set public void hello 巢狀類 public class web webname,weburl class program 匿名類 如果某個類的例項物件只會使用到一次,可以使...
點類,圓類,圓柱類
print?copyright c 2012,煙台大學計算機學院 all rights reserved.檔名稱 text.cpp 作 者 胡穎 完成日期 2013年5月20日 版 本 號 v1.0 輸入描述 無 問題描述 1 先建立乙個point 點 類,包含資料成員x,y 座標點 2 以poin...