亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 6313 | 回復: 2
打印 上一主題 下一主題

INFORMIX鎖機制及如何分析其鎖沖突(第二部分) [復制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2009-01-08 16:56 |只看該作者 |倒序瀏覽
介紹
        在多用戶數(shù)據(jù)庫系統(tǒng)中擁有成千上萬的并發(fā)用戶在同時訪問數(shù)據(jù),因此我們需要有某種機制來保護數(shù)據(jù)以維護其數(shù)據(jù)一致性。除了事物日志機制外,鎖機制就是我們采用的另一個主要手段。
        然而,鎖機制經(jīng)常會導致沖突及等待現(xiàn)象的發(fā)生。這通常是一個DBA在日常管理工作中會碰到的一個普遍問題。如果缺乏一些適當?shù)哪_本或手段,往往會導致在分析鎖問題時變得越來越復雜并出現(xiàn)錯誤。
        本文將闡述IDS的鎖機制,幫助你分析出現(xiàn)的鎖沖突及鎖等待的情況。以下的示例基于數(shù)據(jù)庫stores_demo,該數(shù)據(jù)庫可通過以下命令創(chuàng)建:
        dbaccessdemo stores_demo -log

鎖的動態(tài)分配

它是如何工作的

        在onconfig配置文件中的參數(shù)LOCKS(最大值:8000000)指定了整個實例在啟動時初始化可供使用的鎖資源。然而后續(xù)的IDS版本具有動態(tài)分配鎖資源的能力(大約是9.3X以后)。如果鎖的使用量達到最初設(shè)置的初始值,則IDS會自動擴大其內(nèi)部鎖資源表的大小。這個過程將會重復15次。每次擴大最多可以增加100000個鎖資源,因此IDS鎖資源的最大值為9500000。

8.000.000 inital + (15 x 100.000) additions = 9.500.000 total

        動態(tài)鎖資源的分配功能能夠使當鎖的使用量在達到預先設(shè)置的最大值以后,仍然可以繼續(xù)分配鎖資源,確保應(yīng)用的繼續(xù)進行,同時又能保證鎖資源表不是特別大,以達到較高的運行性能。

        在IDS 10.0.FC5及后續(xù)版本,可設(shè)置的LOCKS最大值擴大為500000000,每次可動態(tài)增加的鎖資源擴大為1000000,可重復擴充的次數(shù)增大為100,因此鎖資源使用上限擴大為600000000。但應(yīng)注意的是鎖資源并不是設(shè)置得越大越好,因為這會浪費資源降低系統(tǒng)運行性能,因此應(yīng)根據(jù)需要合理設(shè)置。

非優(yōu)化的應(yīng)用
        有時候,動態(tài)分配鎖資源會將一些設(shè)計不好的應(yīng)用程序掩蓋掉。比較好的一種方式是應(yīng)該能夠?qū)蝹會話所能申請的最大鎖資源進行控制。這樣就能夠幫助DBA快速定位那些執(zhí)行不好的應(yīng)用,同時又不好影響其他應(yīng)用的正常運行。
        目前當數(shù)據(jù)庫達到鎖資源的上限以后,如果仍需申請鎖資源,那么所有申請資源正在運行的會話都會接收到鎖表溢出的錯誤。這意味著很多應(yīng)用都會由于一個編寫不好的應(yīng)用所牽連。這并不是一個理想的狀態(tài)。

鎖等待時間

針對每個數(shù)據(jù)庫會話進行設(shè)置

        每個數(shù)據(jù)庫會話都可以單獨設(shè)置鎖等待時間,以防止由于鎖等待超時而影響到整個應(yīng)用。IDS缺省是不設(shè)置鎖等待時間的,這也就是說一旦數(shù)據(jù)庫檢測到鎖沖突存在,數(shù)據(jù)庫會立刻返回錯誤給對應(yīng)的應(yīng)用。

        -244: Could not do a physical-order read to fetch next row
        107: ISAM error: record is locked

        為此你可以對每個會話設(shè)定相應(yīng)的鎖等待時間:
       
        set lock mode to not wait
        set lock mode to wait
        set lock mode to wait <#sec>

分布式事物:

        對于分布式事物,配置參數(shù)DEADLOCK_TIMEOUT將會指定本地IDS數(shù)據(jù)庫等待遠端數(shù)據(jù)庫鎖資源的最長時間,如果在此時間內(nèi)未能獲得相應(yīng)的鎖資源則返回錯誤給應(yīng)用。

推薦方法:
       
        如果指定無限制的鎖等待(set lock mode to wait) 這并不是一個好方法。這會加劇鎖沖突和死鎖現(xiàn)象的出現(xiàn),這是一個不好的編程習慣。

        在OLTP環(huán)境中一般設(shè)置鎖等待時間為5-10秒是比較合理的。如果在指定的時間內(nèi)不能獲得對應(yīng)的鎖資源,數(shù)據(jù)庫會返回一個SQL錯誤給應(yīng)用。這時應(yīng)用可以決定是否重新發(fā)起該操作或回滾整個事物。

檢查會話的設(shè)置情況

        你可以通過onstat -g sql命令獲得當前正在運行會話的隔離級及鎖等待的模式:

Listing 1. Session isolation level - onstat -g sql

                               
Output from the onstat -g sql command:
--------------------------
Sess  SQL            Current            Iso Lock       SQL  ISAM F.E.
Id    Stmt type      Database           Lvl Mode       ERR  ERR  Vers Explain
18    -              stores_demo        CR
                                            Not Wait   0    0    9.03  Off
16    -              stores_demo        RR
                                            Wait 10    0    0    9.03  Off

        本例顯示了2個采用不同隔離級的數(shù)據(jù)庫會話:
        Session 18, CR Committed Read, Not Wait
        Session 16, RR Repeatable Read, Wait 10

        后續(xù)一個比較好的功能可能是:在沒有顯式使用set lock mode to wait...命令設(shè)置鎖等待時間的情況下,數(shù)據(jù)庫具有在數(shù)據(jù)庫或?qū)嵗患壴O(shè)置缺省的鎖等待時間的能力。

死鎖:

        死鎖出現(xiàn)在2個用戶同時擁有各自的鎖資源,同時他們又互相申請屬于對方的鎖資源。為了避免死鎖情況的出現(xiàn),會話在申請一個鎖資源的時候,IDS通過掃描內(nèi)部鎖表來確定是否可能產(chǎn)生死鎖,一旦發(fā)現(xiàn)有此可能即會發(fā)送ISAM error code -143 (deadlock detected)給相關(guān)的會話。

檢測到的可能死鎖數(shù)目:
       
        通過onstat -p命令中的(deadlks column)字段將會顯示自數(shù)據(jù)庫啟動或執(zhí)行onstat -z (zero statistics)命令以來數(shù)據(jù)庫所檢測到的可能死鎖數(shù)目。你可以通過以下SQL命令獲得精確的最近一次數(shù)據(jù)庫啟動時間:

        select dbinfo("utc_to_datetime", sh_pfclrtime) from sysmaster:sysshmvals

Sysmaster表:

        不幸是IDS沒能提供更多的關(guān)于如何檢測死鎖及相關(guān)應(yīng)用的信息。這將使一旦出現(xiàn)死鎖情況以后難于對其如何解決進行分析。sysmaster數(shù)據(jù)庫中的一些表能夠提供進一步的信息:
       
        sysprofile:該表中所保存的死鎖檢測數(shù)與onstat -p命令中deadlks字段所提供的信息是對應(yīng)的
        syssesprof:該表中保存了每個數(shù)據(jù)庫會話所檢查到的可能死鎖數(shù)
        sysptprof:該表中保存了每個數(shù)據(jù)庫表所檢查到的可能死鎖數(shù)

跟蹤死鎖:

        IDS的錯誤跟蹤機制將有助于分析死鎖的現(xiàn)象。因為每次在IDS檢測到一個可能出現(xiàn)的死鎖的時候?qū)䲣伋鯥SAM error code -143,因此你可以使用onmode -I 143命令去跟蹤該錯誤。當下一個死鎖可能被檢查到的時候數(shù)據(jù)庫會立刻產(chǎn)生一個斷言錯誤文件,同時會保存onstat -a的信息。這樣你就可對這些收集到的信息進行分析,找出可能會造成死鎖的對應(yīng)會話,它的SQL執(zhí)行語句及擁有鎖資源的其他相關(guān)會話信息。

死鎖超時:

        配置參數(shù)DEADLOCK_TIMEOUT不會對本地死鎖的檢測時間或本地應(yīng)用的整個等待時間產(chǎn)生任何影響。對于出現(xiàn)在本地的可能死鎖現(xiàn)象IDS是能夠立刻檢測出來的。

        如果一個鎖等待的情況出現(xiàn)在試圖查詢或修改遠端數(shù)據(jù)庫的數(shù)據(jù)的時候,本地數(shù)據(jù)庫實例將會按照通過DEADLOCK_TIMEOUT所指定的等待時間上限進行等待,如果超過該時間,將會被判定為可能出現(xiàn)了一個死鎖情況。ISAM error code -154 (deadlock timeout expired - possible deadlock) 將被返回給相關(guān)應(yīng)用。

        目前IDS還不能跨數(shù)據(jù)庫實例的檢查內(nèi)部鎖表信息;因此它只能通過DEADLOCK_TIMEOUT參數(shù)來指定分布式的鎖超時時間,以此達到檢測可能死鎖的情況。在分布式事物中可以通過set lock mode to wait去重新設(shè)置相應(yīng)的由DEADLOCK_TIMEOUT參數(shù)所指定的死鎖等待超時時間。

分析鎖沖突:

        在OLTP環(huán)境中通常會有眾多的并發(fā)會話同時訪問同樣的記錄。因此,一個比較好的情況是我們使執(zhí)行的事物盡可能的小以減少其出現(xiàn)鎖沖突的可能性。

        如果在你的應(yīng)用中你不同通過set lock mode to wait來設(shè)定鎖等待時間,當你在訪問一個數(shù)據(jù),而這個數(shù)據(jù)已經(jīng)被其他用戶設(shè)置上鎖的時候,你將立刻得到鎖失敗的SQL錯誤。這種錯誤通常是大家所不希望的,所以在應(yīng)用中一般通過set lock mode to wait命令來重新設(shè)定鎖等待時間,這樣IDS的SQL執(zhí)行線程在出現(xiàn)鎖沖突的時候就會進行等待,直到獲得鎖資源或鎖超時。但是這種情況又會使整個實例的運行效率下降。由此用戶會抱怨響應(yīng)時間慢或長時間的執(zhí)行批量作業(yè)。通常,你不能將鎖等待的時間設(shè)置為無限等待。

        在一個正在運行的環(huán)境中分析鎖等待的情況通常具有一定的挑戰(zhàn)性。一個比較好的方式是可以通過使用一些恰當?shù)哪_本來實時分析這些鎖等待的情況。在下節(jié)我們將會提供一些有用的onstat命令。你可以由此為起點編寫出更好的自動運行腳本,你也可以使用我們提供的lockwt工具。

一些有用的onstat命令:

        出現(xiàn)鎖沖突以后使用onstat -u命令是一個較好的起點。它包含2個有用的信息:

        當前每個會話所擁有的鎖資源信息
                locks字段將會告訴你該會話擁有多少鎖資源。那些使用了較多鎖資源的會話通常會導致鎖沖突。這并不是必然情況,但使用較大鎖資源的應(yīng)用間接也說明了它可能不是一個比較優(yōu)化的應(yīng)用。

        會話當前等待鎖的情況
                在flags字段的首位將會以‘L’的形式表明該會話正在等待一個鎖資源

Listing 2. Locks held and sessions waiting for a lock - onstat -u

                               
Output from the onstat -u command:
---------------------
address  flags   sessid   user     tty      wait     tout locks nreads   nwrites
4506b44c L-BPR-- 20       informix 11       440cfac4 -1   17    19       0
4506b978 Y--P--D 16       informix -        4407d138  0    0     0        0
...
...

        你可以通過執(zhí)行onstat -k | grep 'L-'命令來獲得所有當前正在等待鎖的所有會話信息。通過onstat -g ses <sessid>命令,你可以確定哪個具體的SQL正在被會話執(zhí)行。你也可以看到當前被打開的數(shù)據(jù)庫(Current Database),當前所使用的隔離級(Iso Lvl),鎖的等待時間(Lock Mode)。在status字段,你可以看到還剩余多少時間將到達鎖超時所設(shè)定的時間。

Listing 3. Analyze sessions in lock wait status - onstat -g ses <sessid>

                                       
Output from the onstat -g ses 20 command:
-----------------------------
...
...
42       sqlexec  4506b44c L-BPR--  7168     sleeping(secs: 9)
...
...
Sess  SQL            Current            Iso Lock       SQL  ISAM F.E.
Id    Stmt type      Database           Lvl Mode       ERR  ERR  Vers Explain
20    DELETE (all)   stores_demo
                                        CR
                                        Wait 60        0    0  9.03  Off
...
...
Current SQL statement:
   delete from customer
       
        下一步,需要確定鎖資源的擁有者,它將導致鎖等待。使用onstat -k命令可以列出數(shù)據(jù)庫實例當前所分配的所有鎖資源信息:

Listing 4. Locks currently allocated in IDS - onstat -k

                               
Output from the onstat -k command:
--------------------------
IBM Informix Dynamic Server Version 11.50.UC3     -- On-Line -- Up 00:01:29 -- 66016 Kbytes

Locks
address  wtlist   owner    lklist   type     tblsnum  rowid    key#/bsiz
5411a970 0        55a769dc   0        HDR+S    100002   206         0      
5411a9d0 0        55a763e0   0            S    100002   206         0      
5411aa30 0        55a76fd8   0            S    100002   206         0      
5411aa90 0        55a775d4   0        HDR+S    100002   205         0      
5411aaf0 0        55a775d4   5411e210 HDR+X    20003e   203         0     U
5411ab50 0        55a775d4   5411e510 HDR+X    200054   302      K- 1    I  
5411ac70 0        55a775d4   5411aaf0 HDR+X    20003e   204         0     U
5411d910 0        55a775d4   5411e630 HDR+X    20003e   108         0     U
5411dc70 0        55a775d4   5411de50 HDR+X    20003e   104         0     U
5411dcd0 0        55a775d4   5411e990 HDR+X    20003e   20c         0     U
5411dd30 0        55a775d4   5411e690 HDR+X    20003e   10a         0     U
5411dd90 0        55a775d4   5411eab0 HDR+X    20003e   302         0    I  
5411de50 0        55a775d4   5411deb0 HDR+X    20003e   103         0     U
5411deb0 0        55a775d4   5411df70 HDR+X    20003e   100         0      
5411df10 0        55a775d4   5411e090 HDR+X    20003e   208         0     U
5411df70 55a77bd0 55a775d4   5411e330 HDR+X    20003e   102         0     U
5411dfd0 0        55a775d4   5411df10 HDR+X    20003e   209         0     U
5411e030 0        55a775d4   5411dd30 HDR+X    20003e   10b         0     U
5411e090 0        55a775d4   5411e150 HDR+X    20003e   207         0     U
5411e0f0 0        55a775d4   5411e390 HDR+X    20003e   106         0     U
5411e150 0        55a775d4   5411e3f0 HDR+X    20003e   206         0     U
5411e1b0 0        55a775d4   5411e030 HDR+X    20003e   10c         0     U
5411e210 0        55a775d4   5411e750 HDR+X    20003e   200         0      
5411e270 0        55a775d4   5411e6f0 HDR+X    20003e   201         0      D
5411e2d0 0        55a77bd0   0            S    100002   205         0      
5411e330 0        55a775d4   5411aa90 HDR+IX   20003e   0           0      
5411e390 0        55a775d4   5411dc70 HDR+X    20003e   105         0     U
5411e3f0 0        55a775d4   5411ac70 HDR+X    20003e   205         0     U
5411e450 0        55a775d4   5411e5d0 HDR+X    20003f   302      K- 1    I  
5411e4b0 0        55a775d4   5411e1b0 HDR+X    20003e   10d         0     U
5411e510 0        55a775d4   5411e450 HDR+X    200054   201      K- 1      D
5411e570 0        55a775d4   5411dfd0 HDR+X    20003e   20a         0     U
5411e5d0 0        55a775d4   5411e270 HDR+X    20003f   201      K- 1      D
5411e630 0        55a775d4   5411e0f0 HDR+X    20003e   107         0     U
5411e690 0        55a775d4   5411d910 HDR+X    20003e   109         0     U
5411e6f0 0        55a775d4   5411e4b0 HDR+X    20003e   10e         0     U
5411e750 0        55a775d4   5411ab50 HDR+X    20003e   202         0     U
5411e990 0        55a775d4   5411e570 HDR+X    20003e   20b         0     U
5411e9f0 0        55a775d4   5411dcd0 HDR+X    20003e   20d         0     U
5411ea50 0        55a775d4   5411e9f0 HDR+X    20003e   20e         0     U
5411eab0 0        55a775d4   5411ea50 HDR+X    20003e   301         0     U
5411edb0 0        55a77bd0   5411e2d0     IX   20003e   0           0      
...
...
       
        在這部分第二個字段wtlist能夠提供一些有用信息。它包含了正在等待該鎖資源的用戶線程16進制地址信息。但是由于當前實例所配置的鎖資源可能較多,因此onstat -k命令的輸出也較大。你可以使用以下命令快速定位哪個會話是當前申請鎖資源的擁有者,例如線程地址55a77bd0正在等待的鎖資源:

        AWK : onstat -k | awk '$2 ~/55a77bd0/ { print }'
        PERL: onstat -k | perl -ane 'print if $F[1] eq "55a77bd0"'
       
        owner字段將告訴你鎖資源擁有者的內(nèi)存地址信息。然后你可以根據(jù)這些信息通過onstat -u和grep命令找到對應(yīng)的會話信息。這樣你就可以使用onstat -g <sessid>命令來具體分析是什么原因?qū)е铝随i等待。如果你發(fā)現(xiàn)這個鎖資源的擁有者也在等待其他的鎖資源(在onstat -u輸出的flags字段第一個符號為‘L’表示),那么你應(yīng)該重復上述的步驟找到該鎖資源的下一個擁有者。

/home/informix/115nstat -u |grep 55a775d4
55a775d4 Y-BP--- 26       informix 0        5741b530 0    37    42       0

/home/informix/115nstat -g ses 26

IBM Informix Dynamic Server Version 11.50.UC3     -- On-Line -- Up 00:10:37 -- 66016 Kbytes

session           effective                            #RSAM    total      used       dynamic
id       user     user      tty      pid      hostname threads  memory     memory     explain
26       informix -         0        16503    zyl-fedo 1        94208      71536      off

tid      name     rstcb    flags    curstk   status
89       sqlexec  55a775d4 Y-BP---  5696     cond wait  netnorm   -

Memory pools    count 2
name         class addr     totalsize freesize #allocfrag #freefrag
26           V     5754a028 90112     20256    110        20        
26*O0        V     574fb028 4096      2416     1          1         

name           free       used           name           free       used      
overhead       0          3360           scb            0          96        
opentable      0          3808           filetable      0          992      
ru             0          464            log            0          16512     
temprec        0          21600          keys           0          832      
gentcb         0          1208           ostcb          0          2632      
sqscb          0          14552          sql            0          40        
rdahead        0          832            hashfiletab    0          280      
osenv          0          1744           sqtcb          0          2376      
fragman        0          208            

sqscb info
scb      sqscb    optofc   pdqpriority sqlstats optcompind  directives
5770a018 576f7018 0        0           0        2           1         

Sess       SQL            Current            Iso Lock       SQL  ISAM F.E.
Id         Stmt type      Database           Lvl Mode       ERR  ERR  Vers  Explain   
26         -              stores             CR  Not Wait   0    0    9.24  Off        

Last parsed SQL statement :
  update customer set address2="zylzyl"

/home/informix/115nstat -u |grep 55a77bd0
55a77bd0 L--PR-- 27       informix 1        5411df70 20   2     0        0
       
/home/informix/115nstat -g ses 27

IBM Informix Dynamic Server Version 11.50.UC3     -- On-Line -- Up 00:11:08 -- 66016 Kbytes

session           effective                            #RSAM    total      used       dynamic
id       user     user      tty      pid      hostname threads  memory     memory     explain
27       informix -         1        16504    zyl-fedo 1        61440      47968      off

tid      name     rstcb    flags    curstk   status
146      sqlexec  55a77bd0 Y--P---  5696     cond wait  netnorm   -

Memory pools    count 2
name         class addr     totalsize freesize #allocfrag #freefrag
27           V     577a6028 57344     11056    91         12        
27*O0        V     57554028 4096      2416     1          1         

name           free       used           name           free       used      
overhead       0          3360           scb            0          96        
opentable      0          1792           filetable      0          352      
log            0          16512          temprec        0          2144      
keys           0          160            gentcb         0          1208      
ostcb          0          2632           sqscb          0          14544     
sql            0          40             rdahead        0          832      
hashfiletab    0          280            osenv          0          1744      
sqtcb          0          2064           fragman        0          208      

sqscb info
scb      sqscb    optofc   pdqpriority sqlstats optcompind  directives
578ee018 577a7018 0        0           0        2           1         

Sess       SQL            Current            Iso Lock       SQL  ISAM F.E.
Id         Stmt type      Database           Lvl Mode       ERR  ERR  Vers  Explain   
27         -              stores             CR  Wait 20    0    0    9.24  Off        

Last parsed SQL statement :
  update customer set address2="zyl111"

論壇徽章:
0
2 [報告]
發(fā)表于 2009-01-08 16:57 |只看該作者
Lockwt工具:

        使用Esql/C編寫的工具lockwt非常適合用來分析鎖等待的情況。為了能使用該工具,你需要安裝Informix Client SDK及C編譯器,然后編譯該工具。該工具會搜索sysmaster數(shù)據(jù)庫里面的系統(tǒng)表以找到出現(xiàn)的鎖等待情況信息。

        該工具將顯示每個會話所占有鎖資源的信息,及哪些會話在等待這些鎖資源釋放。執(zhí)行l(wèi)ockwt -r <#sec> 命令可以按照指定的時間間隔重復收集信息(類似于onstat -r命令)。

        該工具可以實時監(jiān)控復雜的鎖資源等待情況,同時以簡單易讀的形式將相關(guān)信息顯示出來。

Listing 5. Lockwt - Description of the output format

                               
Output from lockwt:
-------------------
(0) (1)  (2)  (3)    (4)           (5)                 (6)          (7)        (         (9)
|-------10--------20--------30--------40--------50--------60--------70--------80--------9|
|-------- XML error:  The previous line is longer than the max of 90 characters ---------|
  WAIT SID ID  PROCNAME    USERNAME           LKTYPE    DATABASE:TABLENAME   LKOBJ
               
0 -   13900:12303 workprocess3   dbuser                  X        rome    rders          row
|-------10--------20--------30--------40--------50--------60--------70--------80--------9|
|-------- XML error:  The previous line is longer than the max of 90 characters ---------|
1 W   53600:23613 batchp12       dbuser                           rome    rders
               
               
Colno Purpose
                                (0)   Sequence number
               
(1)   Waiting or not waiting, possible values are:
      "-" - this session is the holder of the lock and is always listed first.
      "W" - this session(s) is(are) waiting for the above session.
               
(2)   Session ID of this session in the database server
               
(3)   Process ID  of the UNIX process, remote connections have pid -1
               
(4)   Process name of the UNIX process. If it is a remote connection
      (pid = -1), no process name will be available.
               
(5)   UNIX username of this session
               
(6)   Type of lock, possible values are:
      "X" - Exclusive Lock
      "S" - Shared Lock
      "U" - Update Lock
      For additional lock types, execute the following sql-statement:
      -> select txt from sysmaster:flags_text where tabname = "syslcktab"
               
(7)   Database name
               
(   Table name, the lock is on. If it is an index lock and the index is detached
      from the table (has it's own partition number), the name of that index
      is shown here.
               
(9)   Type of object locked, possible values are:
      "table" - this is a table lock
      "idx" - this is an index key lock
      "page" - this is a page lock
      "row" - this is a row lock
       



Listing 6. Lockwt - Lock wait situation I

                               
Output from lockwt:
-------------------
WAIT   SID  ID   PROCNAME     USERNAME LKTYPE DATABASE:TABLENAME       LKOBJ
               
0 -    13900:12303 workprocess3 dbuser   X      rome    rders          row
1 W    53600:23613 batchp12     dbuser          rome    rders
       
        本例中,會話13900 (process "workprocess3"是表orders上鎖資源的擁有者,會話53600正在等待這些鎖資源的釋放,因此你需要通過執(zhí)行onstat -g ses 13900命令去檢查會話13900以證實其運行是否正常。

Listing 7. Lockwt - Lock wait situation II

                               
Output from lockwt:
-------------------
WAIT   SID  ID   PROCNAME     USERNAME LKTYPE DATABASE:TABLENAME       LKOBJ
               
0 W     3894:   -1 (remote)     eherber1 X      rome    :status          row
1 W    17048: 3140 batchp3      dbuser          rome    :status
               
0 -    63296:   -1 (remote)     eherber1 X      rome    :customer_order  row
1 W     3894:   -1 (remote)     eherber1        rome    :customer_order
       
        本例是一個交復雜的情況。會話17048正在等待會話3894設(shè)置在表status上的鎖資源釋放。但是通過檢查下一部分可以發(fā)現(xiàn),會話3894本身也在等待會話63296釋放相應(yīng)的鎖資源。這是一個典型的鎖等待傳遞案例,因為會話3894占據(jù)了別的會話需要使用的鎖資源,而它本身又在等待被其他會話所擁有的鎖資源。因此我們應(yīng)該通過onstat -g ses 63296去具體分析會話63296是否在正常執(zhí)行。

        從工具lockwt的源代碼中,你可以抽取那些與sysmaster相關(guān)的查詢語句以形成你自己的查詢語句。

打開游標的問題:

        可能你在修改表的時候曾經(jīng)碰到過類似的問題。即使你能夠在該表上設(shè)置排他鎖,你仍然不能對該表進行修改。以下為示例的整個過程:

Listing 8. Non-exclusive access on a table

                               
Output from dbaccess -e stores_demo <script.sql>:
--------------------------------------------------
begin;
  Started transaction.

lock table customer in exclusive mode;
  Table locked.

alter table customer add (mycol integer);
  242: Could not open database table (informix.customer).
  106: ISAM error: non-exclusive access.
               
        出現(xiàn)這種情況有可能是由于有其他的用戶在表customer上使用了游標進行數(shù)據(jù)讀取。由于游標并不在具體的數(shù)據(jù)記錄上放置任何鎖,否則我們就不可能能夠?qū)⒃摫硪耘潘姆绞芥i住,但是它卻能防止其他用戶對表的partition信息進行修改。

        1、要解決該問題,首先需要找到該表的16進制partnum:
                Select hex(partnum)  from systables where tabname = "customer".
        2、如果partnum為0,那么這可能是一個分片表。你需要執(zhí)行以下命令來找到分片表的partnum:
                Select st.tabname, dbinfo("dbspace", sf.partn), hex(sf.partn)  from systables st, sysfragments sf, where st.tabid = sf.tabid and sf.fragtype = "T"and st.tabname = "customer".
        3、用找到的partnum結(jié)合onstat命令搜索當前打開表的信息:
                onstat -g opn | grep -i <hex_partnum>
        4、從rstcb字段,它表明了相關(guān)會話線程的內(nèi)存地址信息,據(jù)此信息使用onstat -u命令進行搜索:
                onstat -u | grep <rstcb_without_leading_0x>

        在確定與此相關(guān)的會話以后,你可以通過onmode -z <sessid>終止相關(guān)的會話。

        如果你使用IDS 7.31.xD5, 9.40 or 10,你可以使用環(huán)境變量IFX_DIRTY_WAIT。該環(huán)境變量可以被設(shè)置在服務(wù)器端或客戶端。該變量指定了在執(zhí)行DDL命令時將等待數(shù)據(jù)庫完成修改操作所需的時間。如果指定的時間超時,數(shù)據(jù)庫將返回與沒有設(shè)置該變量時同樣的錯誤。

總結(jié):

        在一個擁有眾多并發(fā)事物正在運行的環(huán)境下,實時分析鎖沖突的情況是一個比較艱巨的任務(wù)。但是通過本文對數(shù)據(jù)庫鎖機制的介紹,將有助于大家在分析鎖沖突的時候縮短所需時間。

下載lockwt工具:        http://www.herber-consulting.de/ ... .pl?action=IfmxUtil

本文作者:Eric Herber

論壇徽章:
5
榮譽會員
日期:2011-11-23 16:44:17CU大;照
日期:2013-09-18 15:15:15CU大;照
日期:2013-09-18 15:15:45未羊
日期:2014-02-25 14:37:19射手座
日期:2014-12-26 22:55:37
3 [報告]
發(fā)表于 2009-01-08 17:35 |只看該作者
11.5用USE_LASTCOMMIT,在CR模式下,能解決不少鎖沖突問題。
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP