程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> 關於Oracle數據庫 >> 解決Oracle ERP死鎖的方法

解決Oracle ERP死鎖的方法

編輯:關於Oracle數據庫

  今天,功能顧問說客戶在作付款的時候忽然客戶端掉電,然後再次登錄以後就無法繼續付款了,報錯界面如下。

  明顯是意外掉電導致的客戶端進程沒有釋放,所以產生了始終不釋放的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裡面是查不到鎖定視圖的會話的,所以通常我們還需要找到這個視圖的定義,然後查詢視圖使用的基表。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved