今天,功能顧問說客戶在作付款的時候忽然客戶端掉電,然後再次登錄以後就無法繼續付款了,報錯界面如下。
明顯是意外掉電導致的客戶端進程沒有釋放,所以產生了始終不釋放的lock。
如果對於業務比較熟悉,知道這是哪個form,問清楚客戶使用的什麼職責,通常從v$lock和v$session中就可以得到足夠的信息,然後kill掉產生lock的會話就可以了。
但是如果對於業務不熟悉就只能依靠Oracle RDBMS的知識一點點檢查了,我的解決方法基本上是這樣。
1。為發生錯誤的Form加上跟蹤
2。重現錯誤,在udump目錄下查看trace文件
3。找到這樣的報錯
PARSINGINCURSOR#70len=120dep=0uid=44oct=3lid=44tim=2502449707361hv=3320467580ad=’99f21c88′
SELECTLAST_DOCUMENT_NUM+1FROMAP_CHECK_STOCKSWHERECHECK_STOCK_ID=:b1FORUPDATEOFLAST_DOCUMENT_N
UMNOWAIT
ENDOFSTMT
PARSE#70:c=0,e=2425,p=0,cr=2,cu=0,mis=1,r=0,dep=0,og=0,tim=2502449707353
WAIT#70:nam=’SQL*Netmessagetoclient’ela=2p1=1952673792p2=1p3=0
WAIT#70:nam=’SQL*Netmessagefromclient’ela=356p1=1952673792p2=1p3=0
BINDS#70:
bind0:dty=2mxl=23(22)mal=00scl=00pre=00oacflg=03oacfl2=0size=24offset=0
bfp=800003fb8005b6f8bln=23avl=04flg=05
value=10094
EXEC#70:c=0,e=1159,p=0,cr=7,cu=1,mis=0,r=0,dep=0,og=4,tim=2502449709034
ERROR#70:err=54tim=256250850
4。確認err=54是資源繁忙的錯誤
$oerrora54
00054,00000,“resourcebusyandacquirewithNOWAITspecified”
//*Cause:Resourceinterestedisbusy.
//*Action:Retryifnecessary.
5。查看dba_objects和v$locked_object,找到對SQL中的表加鎖的SESSION_ID,然後kill這個會話。
這一步需要注意的是,Oracle ERP系統中使用了大量的帶有CLIENT_INFO環境參數的視圖,比如本例中的AP_CHECK_STOCKS就是一個視圖,所以直接從v$locked_object裡面是查不到鎖定視圖的會話的,所以通常我們還需要找到這個視圖的定義,然後查詢視圖使用的基表。