ORA-24756: 事務處理不存在 分析
問題描述:
河南在2009年4月28日早09:23出現櫃面交易如CDM,FIX,CARDTLR等服務堵塞,且排隊不斷增加,後透過down掉FIX、CARDTLR服務後使資源得到釋放,在事後的分析中,我們發現在出現異常堵塞時,產生了tuxedo和資料庫通訊異常的日誌,xa_NULL02232009.trc,檢視日誌內出現問題的pid,發現均為綠卡通的相關服務id
日誌內容是多個:
092345.4210884.0:
xaostart: XAER_NOTA; RESUME|JOIN and can't switch txn
ORACLE XA: Version 9.2.0.1.0. RM name = 'Oracle_XA'.
092438.3817644.0:
ORA-24756: 事務處理不存在
分析:
檢視資料庫alert_*.log (back)日誌:
ue Apr 28 09:28:24 2009
Undo Segment 35 Onlined
Tue Apr 28 09:28:24 2009
Undo Segment 36 Onlined
Tue Apr 28 09:28:24 2009
Undo Segment 37 Onlined
Tue Apr 28 09:28:25 2009
Created Undo Segment _SYSSMU60$
Tue Apr 28 09:28:25 2009
Created Undo Segment _SYSSMU61$
Tue Apr 28 09:28:25 2009
Created Undo Segment _SYSSMU62$
很多上面的類似日誌,發現undo 日誌的建立和切換的日誌
切換unto tablespace ,也就是新建一個臨時undo tablespace,切換一下,待處理完畢後切換回來
分析:
資料庫本身會根據事務的量,自己調節建立和回收UNDo 資料段,undo 日誌不斷的建立和切換的過程是因為短時間事務極速的上升,並且這是事務的處理存在大量需要事務回滾,資料的回滾造成事務的處理時間減慢,TUXEDO的處理等待時間變長,導致會話事務超時前(Session timeout (SesTm))就會觸發了Global transaction timeout (全域性事務超時),就會發生上面的錯誤:
ORA-24756: 事務處理不存在
結論:
相關的資料庫引數:
1. Global transaction timeout
2. Session timeout (SesTm)
3. Oracle distributed_lock_timeout
要求: Global transaction timeout 《 Session timeout (SesTm) 《 Oracle distributed_lock_timeout
事務的超時時間基本與上面三個時間有關,在設定超時時間的時候一般要遵從上面的原則。
參考資料:
2.14 ORACLE XA OPENINFO引數:SESTM
2.14.1 引數出處
UBBCONFIG配置檔案 -> GROUPS -> OPENINFO ->SESTM 。
2.14.2 時間單位
秒。
2.14.3 取值範圍
大於等於0,0表示無限時長。
2.14.4 預設取值
無,使用時必須明確設定 。
2.14.5 用途解釋
會話靜默等待時長,即全域性交易中,作為資源管理器(resource manager)已經參與交易並完成相應的資料操作的資料庫,等待全域性交易中的其他參與方操作完成的時間長度。
舉例說明:
假設一個全域性交易由以下幾個部分組成:
(1)tpbegin(T,0) ->
(2)tpcall(S1) -> DB1 完成耗時 T1;
(3)tpcall(S2) -> DB2 完成耗時 T2;
(4)其他操作 耗時 T3
(5)tpcommit()
其中,tpcall(S1)訪問資料庫DB1, tpcall(S2)訪問資料庫DB2。
對DB1而言,如果T-T1> T2+T3 > SESTM1,則觸發超時;
對DB2而言,如果T-T1-T2 > T3 > SESTM2,則觸發超時;
由此可以看出,此引數的主要目的是對資料庫進行資源保護,避免在全域性交易中,已經完成任務的資料庫,為等待其他參與方耗費過多的資源,畢竟ORACLE中併發全域性交易的數量是很有限的。
2.14.6 超時後果
觸發此超時後,資料庫將自己主動回滾已經完成的任務,釋放全域性交易資源。TUXEDO控制的全域性交易進行TPCOMMIT時,如果總時間仍沒有超過Transaction TimeOut,那麼TPCOMMIT將失敗,XALOG會記錄下ORACLE錯誤:"ORA-24756: Transaction does not exist"。確實如此,拿上面的例子來說,等到最後TPCOMMIT的時候,DB1已經主動回滾了所有的資料,不難理解,對DB1而言,它好像根本沒有參加過這個全域性交易,自然就會有這樣的錯誤提示。
2.14.7 設定考慮
這個引數是從資料庫自我保護的角度設計的,對資料庫而言,是不得已的辦法。最好的措施還是TUXEDO能夠控制時間,趕在SESTM之前,進行TPABORT,主動通知資料庫進行資料回滾。
用一個簡單的比方:冬天,客人出門時沒有關門,SESTM時間後,客人還沒有回來,主人感覺到冷了,只好自己去關門,不管什麼理由,這樣總是不太好。如果在SESTM時間內,客人能及時回來關門,主人就不會感覺那麼差。
從前面的超時觸發分析,我們也能發現,只要設定SESTM 能夠大於 TransactionTimeOut的話,就能夠儘量的不觸發此超時機制,達到較好的效果。
2.17 ORACLE distributed_lock_timeout
2.17.1 引數出處
ORACLE初始引數檔案:init.ora -> distributed_lock_timeout。
2.17.2 時間單位
秒。
2.17.3 取值範圍
大於0。
2.17.4 預設取值
60 。
2.17.5 用途解釋
分散式事務鎖等待超時(distributed transaction waiting for lock),指第二個事務處理需要的資料庫資源,正被第一個分散式事務佔用而鎖定,那麼,第二個事務將等待第一個分散式事務釋放此資源,等待distributed_lock_timeout時間後,如果第一分散式事務仍然沒有釋放此資源,第二個事務觸發此超時。
2.17.6 超時後果
如果資源被第一個事務正常使用鎖定,ORACLE回滾第二個事務,並返回錯誤:"ORA-02049: time-out: distributed transaction waiting for lock "。
如果第一個事務處理完成,資源釋放後,再嘗試第二個事務,就會成功。如果第二個事務不能等待資源自動釋放,那麼可以採用處理資料庫死鎖(deadlock)的措施,人工介入,清除第一個事務,但一般不建議採用這種方式,因為第一個事務一般會正常結束的。
如果資源被第一個事務因為處於不確定分佈事務狀態(in-doubt distributed transaction)而鎖定,ORACLE回滾第二個事務,並返回錯誤:"ORA-01591: lock held by in-doubt distributed transaction identifier "。
這種錯誤遇到的可能性較小,一般只有在分佈事務的關鍵提交階段出現網路、系統故障,才可能出現此故障,而且,當網路、系統故障恢復後,ORACLE一般可以自己解決此問題,不需要人工介入。如果一定要人工介入,可以查閱ORACLE專門的手冊。
2.17.7 設定考慮
出現這樣的超時,是因為特定資料庫資源的使用碰撞,要分析應用系統的業務特點,確定碰撞可能發生的條件,在此條件下,資源可能被先來者鎖定多長時間(T1),後來者又能夠等多長時間(T2),再來設定此引數(T)的大小。如果在大多數情況下,T1 < T2, 那麼就設定T1 < T < T2;反之,大多數情況下,T1 > T2,那麼,就設定T < T2。
因此,不分析業務特點,一味的增大和減小是不恰當的。
====================================================
Relevant parameters: WSL中可以配置的-T(客戶端idle時間)、-I(client init時間)引數
另外配置RESOURCE section的BLOCKTIME、SCANUNIT
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29119536/viewspace-1162423/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- spring事務管理原始碼分析(二)事務處理流程分析Spring原始碼
- 分散式事務處理方案,微服事務處理方案分散式
- MySQL事務處理MySql
- 12事務處理
- mysqli 事務處理MySql
- 混合事務分析處理“HTAP”的技術要點分析
- ITL與事務處理
- redis的事務處理Redis
- php事務處理方法PHP
- java事務的處理Java
- MYSQL--事務處理MySql
- SpringDataRedis事務處理SpringRedis
- mysql事務處理(轉)MySql
- [轉載]Oracle 事務處理的完整流程分析Oracle
- 處理tns不存在
- Laravel 分散式事務處理Laravel分散式
- springboot事務處理Spring Boot
- Spring (二) 事務處理Spring
- [MYSQL -26]控制事務處理MySql
- 分散式事務故障處理分散式
- JDBC事務處理設計JDBC
- MySQL中的事務處理MySql
- SQL SERVER 事務處理(一)SQLServer
- sql server 事務處理(二)SQLServer
- 事務處理基本概念
- Redis中的事務處理機制分析與總結Redis
- JDBC 事務處理【最終版】JDBC
- 一次ORACLE分散式事務鎖異常處理分析Oracle分散式
- Spring事務專題(三)事務的基本概念,Mysql事務處理原理SpringMySql
- springcloud分散式事務處理 LCNSpringGCCloud分散式
- mysql事務處理與鎖機制MySql
- Oracle分散式事務典型案例處理Oracle分散式
- Entity Framework中 批量提交 事務處理Framework
- C#處理Access中的事務C#
- 【開發篇plsql】plsql事務處理SQL
- 軟體中事務處理問題!
- 關於jdon 的事務處理疑惑?
- 我的MySql事務處理(可以支援事務處理及資料庫路徑自己定義) (轉)MySql資料庫