gdufo

           

          學習動態性能表 第八篇-(1)-V$LOCK 2007.5.31

           

          這個視圖列出Oracle 服務器當前擁有的鎖以及未完成的鎖或栓鎖請求。如果你覺著session在等待等待事件隊列那你應該檢查本視圖。如果你發現session在等待一個鎖。那么按如下先后順序:

          1.         使用V$LOCK找出session持有的鎖。

          2.         使用V$SESSION找出持有鎖或等待鎖的session執行的sql語句。

          3.         使用V$SESSION_WAIT找出什么原因導致session持有鎖堵塞。

          4.         使用V$SESSION獲取關于持有鎖的程序和用戶的更多信息。

           

          V$LOCK中的常用列

          l         SID:表示持有鎖的會話信息。

          l         TYPE:表示鎖的類型。值包括TMTX等。

          l         LMODE:表示會話等待的鎖模式的信息。用數字06表示,和表1相對應。

          l         REQUEST:表示session請求的鎖模式的信息。

          l         ID1,ID2:表示鎖的對象標識。

           

          公共鎖類型

           

            在Oracle數據庫中,DML鎖主要包括TM鎖和TX鎖,其中TM鎖稱為表級鎖,TX鎖稱為事務鎖或行級鎖。

           

            當Oracle執行DML語句時,系統自動在所要操作的表上申請TM類型的鎖。當TM鎖獲得后,系統再自動申請TX類型的鎖,并將實際鎖定的數據行的鎖標志位進行置位。這樣在事務加鎖前檢查TX鎖相容性時就不用再逐行檢查鎖標志,而只需檢查TM鎖模式的相容性即可,大大提高了系統的效率。TM鎖包括了SS、SX、SX等多種模式,在數據庫中用06來表示。不同的SQL操作產生不同類型的TM鎖,如下表1。

           

          TX:行級鎖,事務鎖

          l         在改變數據時必須是排它模式(mode 6)

          l         每一個活動事務都擁有一個鎖。它將在事務結束(commit/rollback)時釋放。

          l         如果一個塊包括的列被改變而沒有ITL(interested transaction list)槽位(entries),那么session將鎖置于共享模式(mode 4)。當session獲得塊的ITL槽位時釋放。

          l         當一個事務首次發起一個DML語句時就獲得一個TX鎖,該鎖保持到事務被提交或回滾。當兩個或多個會話在表的同一條記錄上執行DML語句時,第一個會話在該條記錄上加鎖,其他的會話處于等待狀態。當第一個會話提交后,TX鎖被釋放,其他會話才可以加鎖。

          l         指出回滾段和事務表項

           

          按下列項以避免競爭:

          l         避免TX6類型競爭,需要根據您的應用而定。

          l         避免TX4類型競爭,可以考慮增加對象INITRANS參數值。

           

          TM:表級鎖

           

          n         數據庫執行任何DDL語句時必須是排它模式;例如,alter table,drop table。

          n         執行像insert,update,delete這類DML語句時處于共享模式。它防止其它session對同一個對象同時執行ddl語句。

          n         任何對象擁有正被改變的數據,TM鎖都將必須存在。

          n         鎖指向對象。

           

          TM隊列避免競爭,可以考慮屏蔽對象表級鎖,屏蔽表級鎖防止對象執行任何ddl語句。

           

          ST:空間事務鎖

          l         每個數據庫(非實例)擁有一個ST鎖。

          l         除了本地管理表空間,在space管理操作(新建或刪除extents)時必須是排它模式。

          l         對象creation, dropping, extension, 以及truncation都處于這種鎖

          l         多數公共原因的爭奪,是在磁盤排序(并非使用真正的臨時表空間)或回滾段擴展或收縮。

           

          按如下項以避免競爭:

          l         使用真正的臨時表空間(true temporary tablespaces),利用臨時文件。臨時段在磁盤排序之后并不創建或刪除。

          l         使用本地管理表空間。

          l         指定回滾段避免動態擴展和收縮,或使用自動undo management

          l         避免應用執行創建或刪除數據庫對象。

           

          UL:用戶定義鎖

          用戶可以自定義鎖。內容較多并與此節關系不大,略過。

           

           

          V$LOCK中的連接列

           

          Column                                     View                                   Joined Column(s)

          SID                                           V$SESSION                        SID

          ID1, ID2, TYPE                          V$LOCK                             ID1, ID2, TYPE

          ID1                                            DBA_OBJECTS                   OBJECT_ID

          TRUNCID1/65536)                     V$ROLLNAME                    USN

           

          1.         如果session在等待鎖,這可被用于找出session持有的鎖,。

          2.         可被用于找出DML鎖類型的被鎖對象(type='TM')

          3.         可被用于找出行級事務鎖(TYPE='TX')使用中的回滾段,不過,需要通過V$TRANSACTION連接查詢得到。

           

           

           

          1 OracleTM鎖類型

          鎖模式

          鎖描述

          解釋

          SQL操作

          0

          none

           

           

          1

          NULL

          Select

          2

          SS(Row-S)

          行級共享鎖,其他對象只能查詢這些數據行

          Select for update、Lock for update、Lock row share

          3

          SX(Row-X)

          行級排它鎖,在提交前不允許做DML操作

          InsertUpdate、Delete、Lock row share

          4

          S(Share)

          共享鎖

          Create index、Lock share

          5

          SSX(S/Row-X)

          共享行級排它鎖

          Lock share row exclusive

          6

          X(Exclusive)

          排它鎖

          Alter tableDrop able、Drop index、Truncate table Lock exclusive

           

            數字越大鎖級別越高, 影響的操作越多。一般的查詢語句如select ... from ... ;是小于2的鎖, 有時會在v$locked_object出現。select ... from ... for update; 2的鎖。

           

            當對話使用for update子串打開一個游標時,所有返回集中的數據行都將處于行級(Row-X)獨占式鎖定,其他對象只能查詢這些數據行,不能進行updatedeleteselect...for update操作。insert / update / delete ... ;     3的鎖。   

           

            沒有commit之前插入同樣的一條記錄會沒有反應, 因為后一個3的鎖會一直等待上一個3的鎖, 我們必須釋放掉上一個才能繼續工作。

           

            創建索引的時候也會產生3,4級別的鎖。locked_mode2,3,4不影響DML(insert,delete,update,select)操作,        DDL(alter,drop)操作會提示ora-00054錯誤。有主外鍵約束時 update / delete ... ; 可能會產生4,5的鎖。DDL語句時是6的鎖。

           

            如果出現了鎖的問題, 某個DML操作可能等待很久沒有反應。當你采用的是直接連接數據庫的方式,也不要用OS系統命令 $kill process_num 或者 $kill -9 process_num來終止用戶連接,因為一個用戶進程可能產生一個以上的鎖, OS進程并不能徹底清除鎖的問題。記得在數據庫級別用alter system kill session 'sid,serial#';殺掉不正常的鎖。

           

          示例:

          我按照自己的理解演示的TX,TM鎖如下:

          1.create table TMP1(col1  VARCHAR2(50));--創建臨時表

          2.select * from v$lock;--關掉當前鎖信息

          3.select * from tmp1 for update; --加鎖

          4.select * from v$lock;   ---看看現在的鎖列表,是不是多了兩條記錄。Type分別為tx,tm,對照表1。

          5.新開一個連接,然后

          select * from tmp1 for update;  --呵呵,等待狀態了吧

          6.select * from v$lock;  --又新增了兩條記錄,其它一條type=tx,lmode=0

          7.查看當前被鎖的session正在執行的sql語句

          select /*+ NO_MERGE(a) NO_MERGE(b) NO_MERGE(c) */ a.username, a.machine, a.sid, a.serial#, a.last_call_et "Seconds", b.id1, c.sql_text "SQL"

          from v$session a, v$lock b, v$sqltext c

          where a.username is not null and a.lockwait = b.kaddr and c.hash_value =a.sql_hash_value

          8.將之前的for update語句commit或者rollback,然后新開連接的session擁有鎖。有興趣的朋友還可以試試兩條for update的時候,關閉先執行的那個窗口,看看oracle會給出什么樣的響應。

           

            這一節是我在自整理v$系列視圖以來花費時間和精力最多的一個,我反復看了document,又從網上搜索了各種資料實際使用案例等,就是不開竅。這一節至今我也仍未有把握說盡在掌握,所以在上述文字中除了例子,我如實貼出了收集來的內容,未加任何自我理解,就是擔心萬一我的理解有誤,會對其它瀏覽本文的人造成困擾。同時我把在收集過程中自我感覺對理解v$lock可能有幫助的資料地址列出,供有心人參考:

           

          Oracle數據庫中的鎖機制研究

          http://soft.zdnet.com.cn/software_zone/2007/0208/377403.shtml

           

          DB2 Oracle的并發控制(鎖)比較

          http://www.ibm.com/developerworks/cn/db2/library/techarticles/dm-0512niuxzh/

           

          Itpub論壇的oracle專題深入討論區也有一篇非常精彩的討論,地址如下:

          我對ORACLE數據鎖的一點體會

          http://www.itpub.net/270059.html

           

           

           

           

          學習動態性能表

          第八篇-(2)-V$LOCKED_OBJECT  2007.6.4

           

            本視圖列出系統上的每個事務處理所獲得的所有鎖。

           

          V$LOCKED_OBJECT中的列說明:

           

          l         XIDUSN:回滾段號

          l         XIDSLOT:槽號

          l         XIDSQN:序列號

          l         OBJECT_ID:被鎖對象ID

          l         SESSION_ID:持有鎖的sessionID

          l         ORACLE_USERNAME:持有鎖的Oracle 用戶名

          l         OS_USER_NAME:持有鎖的操作系統 用戶名

          l         PROCESS:操作系統進程號

          l         LOCKED_MODE:鎖模式,值同上表1

           

          示例:

          1.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#';

          posted on 2009-11-17 14:33 gdufo 閱讀(146) 評論(0)  編輯  收藏 所屬分類: Database (oracle, sqlser,MYSQL)

          導航

          統計

          常用鏈接

          留言簿(6)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          收藏夾

          Hibernate

          友情鏈接

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 静乐县| 宜君县| 潜江市| 合作市| 汶川县| 辽阳市| 泰来县| 山丹县| 仪征市| 额尔古纳市| 瓮安县| 龙口市| 卢湾区| 维西| 米林县| 错那县| 平和县| 徐州市| 宜兰县| 丘北县| 新绛县| 平罗县| 岳阳市| 兴城市| 日喀则市| 汕尾市| 恭城| 孝昌县| 礼泉县| 教育| 同江市| 平顶山市| 清苑县| 紫金县| 寿光市| 方城县| 阜南县| 兴化市| 三河市| 永登县| 鹤峰县|