oracle latch_自譯文_(3)

wisdomone1發表於2010-04-04
越看越感覺,寫得不錯,精彩
請擴充套件閱讀如下章節:

oracle latch自譯文(一)
http://space.itpub.net/9240380/viewspace-631161

oracle latch自譯文(二)
http://space.itpub.net/?uid-9240380-action-viewspace-itemid-631300


我們繼續譯文:


enqueue簡介


  我們來假設一處情景,僅有一個使用者的資料庫引擎
    我們不需要任何locks,哪怕就至少用於併發目的的


然後我們想讓我們的資料庫過渡到支援更多使用者
   實行併發的最簡單方法是什麼呢?
   一個簡單(簡約)的大鎖(lock) ,它可以防止或保護對於任何共享資源的訪問
   但這一個鎖可以讓系統過渡到最好情況嗎,支援更多使用者嗎


把lock鎖分成多個pieces是非常有意義的:--注:pieces我譯為片
   1)每個片用於保護不同型別的資源,比如:
       一個TM表鎖
       這種TM表鎖用於保護被事務修改的行
       一個MR鎖保護對於資料檔案狀態及佈局的更改


   2)更進一步對於單一物件的分類也是必需的,避免不必要的競爭
        這種所謂的enqueue(後我譯為:入隊)資源識別符號也可以納入到(屬於)資源
            一個hash表的slots來確認或標識一些資源
            資源不是鎖,它們只是透過鎖得到的物件的佔位符
            唯一識別符號(pk)與一個資源對應關係包括如下:
                資源型別(tx,tm,mr,etc)
                資源識別符號1(id1)
                   補註:這些資源識別符號用於劃分(表示)不同的資源型別與對應獨立的物件,比如:兩個表都佔用在記憶體中給他們分配的tm鎖資源,那麼id1指明table的物件id(v$lock_type具體表示對於每種資源型別id1/2的含義是什麼)
                資源識別符號2(id2)




locks:
      鎖表示鎖佔用者與被鎖定的資源之間一種關係
      如果在單一資源(以相容模式)出現很多鎖佔用者,這時對於每個物件仍舊只是一個資源,但多個鎖結構指向這個資源


為何鎖叫作入隊?
   這是因為,對於鎖等待者,採用鎖定架構實現一種排序的排隊機制(不好譯)

   latches 和mutexes嚴格意義上講,沒用採用一種精密的排隊機制


入隊資源
    v$resource(x$ksqrs)

入隊鎖
    v$lock(x$ksqe)

入隊資源型別
    v$lock_type-- 記錄著id1和id2的含義
    @lt tx



診斷排錯是一種簡單合適的工具
   v$session_wait
   v$lock


Enqueue tracing events:--入隊追蹤事件
10704, 00000, "Print out information about what enqueues are being obtained" --10704,00000,列印顯示得取入隊的相關資訊
// *Cause: When enabled, prints out arguments to calls to ksqcmi and
// ksqlrl and the return values.
// *Action: Level indicates details:
// Level: 1-4: print out basic info for ksqlrl, ksqcmi
// 5-9: also print out stuff in callbacks: ksqlac, ksqlop
// 10+: also print out time for each line
10706, 00000, "Print out information about global enqueue manipulation"---10706,00000,列印全域性入隊操作的相關資訊
// *Cause: When enabled, prints out activity in ksi routines.
// *Action: INternal system parameter (_ksi_trace) can be used in addition
// to setting this event to limit output information on selected
// set of global enqueue server enqueue type(s)
// For example:
// _ksi_trace = RTXA
// output information only for RT and XA lock types.
//
// *Action: Level indicates details:
// 0-4: show args for each main call
// 5-9: also indicate callbacks
// 10+: also printout time for each line



DEADLOCK DETECTED
[Transaction Deadlock]
Current SQL statement for this session:
update t set object_id = 2 where wner = 'SH'
The following deadlock is not an ORACLE error. It is a
deadlock due to user error in the design of an application
or from issuing incorrect ad-hoc SQL. The following
information may aid in determining the deadlock:
Deadlock graph:
---------Blocker(s)-------- ---------Waiter(s)---------
Resource Name process session holds waits process session holds waits
TX-00070003-00000a4a 19 150 X 16 147 X
TX-0005002e-00000d63 16 147 X 19 150 X
session 150: DID 0001-0013-00000032 session 147: DID 0001-0010-00000452
session 147: DID 0001-0010-00000452 session 150: DID 0001-0013-00000032
Rows waited on:
Session 147: obj - rowid = 0001593C - AAAVk8AABAAARJFAAC
(dictionary objn - 88380, file - 1, block - 70213, slot - 2)
Session 150: obj - rowid = 0001593C - AAAVk8AABAAASG8AAj
(dictionary objn - 88380, file - 1, block - 74172, slot - 35)
Information on the OTHER waiting sessions:
Session 147:
pid=16 serial=625 audsid=-1 user: 0/SYS
O/S info: user: PORGAND\Tanel, term: PORGAND, ospid: 5900:2388, machine: MSHOME\P
program: sqlplus.exe
application name: sqlplus.exe, hash value=0

Current SQL Statement:
update t set object_id = 3 where object_type = 'TABLE'
End of information on OTHER waiting sessions



Slides, scripts and my blog:  ---牛人blog,多看啊,我認為這篇文章講得深入淺出
http://blog.tanelpoder.com
...I will post this session's sqlplus output there after the conference
 




來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/9240380/viewspace-631301/,如需轉載,請註明出處,否則將追究法律責任。

相關文章