今天,功能顧問說客戶在作付款的時(shí)候忽然客戶端掉電,然后再次登錄以后就無法繼續(xù)付款了,報(bào)錯(cuò)界面如下。
明顯是意外掉電導(dǎo)致的客戶端進(jìn)程沒有釋放,所以產(chǎn)生了始終不釋放的lock。
如果對(duì)于業(yè)務(wù)比較熟悉,知道這是哪個(gè)form,問清楚客戶使用的什么職責(zé),通常從v$lock和v$session中就可以得到足夠的信息,然后kill掉產(chǎn)生lock的會(huì)話就可以了。
但是如果對(duì)于業(yè)務(wù)不熟悉就只能依靠Oracle RDBMS的知識(shí)一點(diǎn)點(diǎn)檢查了,我的解決方法基本上是這樣。
1、為發(fā)生錯(cuò)誤的Form加上跟蹤
2、重現(xiàn)錯(cuò)誤,在udump目錄下查看trace文件
3、找到這樣的報(bào)錯(cuò)
PARSING IN CURSOR #70 len=120 dep=0 uid=44 oct=3 lid=44 tim=2502449707361 hv=3320467580 ad=
’99f21c88′
SELECT LAST_DOCUMENT_NUM + 1 FROM AP_CHECK_STOCKS WHERE CHECK_STOCK_ID = :b1 FOR UPDATE
OF LAST_DOCUMENT_N
UM NOWAIT
END OF STMT
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*Net message to client’ ela= 2 p1=1952673792 p2=1 p3=0
WAIT #70: nam=’SQL*Net message from client’ ela= 356 p1=1952673792 p2=1 p3=0
BINDS #70:
bind 0: dty=2 mxl=23(22) mal=00 scl=00 pre=00 oacflg=03 oacfl2=0 size=24 offset=0
bfp=800003fb8005b6f8 bln=23 avl=04 flg=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=54 tim=256250850
4、確認(rèn)err=54是資源繁忙的錯(cuò)誤
$ oerr ora 54
00054, 00000, “resource busy and acquire with NOWAIT specified”
// *Cause: Resource interested is busy.
// *Action: Retry if necessary.
5、查看dba_objects和v$locked_object,找到對(duì)SQL中的表加鎖的SESSION_ID,然后kill這個(gè)會(huì)話。
這一步需要注意的是,Oracle ERP系統(tǒng)中使用了大量的帶有CLIENT_INFO環(huán)境參數(shù)的視圖,比如本例中的AP_CHECK_STOCKS就是一個(gè)視圖,所以直接從v$locked_object里面是查不到鎖定視圖的會(huì)話的,所以通常我們還需要找到這個(gè)視圖的定義,然后查詢視圖使用的基表。
更多信息請(qǐng)查看IT技術(shù)專欄