Oracle

如何連接到特定的會話 ID 和序列號?被阻止的會話

  • June 2, 2020

我已經阻止了會話,並查看哪個會話阻止了它們,有session_idserial#. 是否可以連接到這樣的會話?如何?

背景:使用V$SESSION_BLOCKERS我看到會話被 INSERT 語句相互阻止到兩個表之一:_REQUEST 和 _RESPONSE

阻塞會話等待事件:enq: TX - row lock contention

查詢一:

insert into _REQUEST (creation_date, IS_PROCESSED, name, packet, PARENT_SKID, BATCH_SKID, retry_delay, revision, SERVICE_NAME, ttl, type, REQUEST_SKID)
values (:1 , :2 , :3 , :4 , :5 , :6 , :7 , :8 , :9 , :10 , :11 , :12 )

查詢 2a(來自 DB 觸發器,:B1 是有效負載):

SELECT COALESCE(ERROR_DETAILS, ERROR_MESSAGE, FAULT_REASON, SOAP_ERROR) AS ERROR_MESSAGE, ERROR_CODE 
FROM XMLTABLE( '//*:DataHandlerWebServiceException | //*:Fault | //*:PLMDataHandlerError' 
    PASSING XMLTYPE(:B1 )
    COLUMNS ERROR_DETAILS VARCHAR2(256) PATH '*:errorDetails'
           ,ERROR_MESSAGE VARCHAR2(256) PATH '*:errorMessage'
           ,ERROR_CODE VARCHAR2(8) PATH '*:errorCode'
           ,FAULT_REASON VARCHAR2(256) PATH '*:Reason/*:Text'
           ,SOAP_ERROR VARCHAR2(256) PATH '*:COMMON_LOG_MESSAGE/*:LOG_MESSAGE' )

查詢 2b(我們已經知道 APPEND 在這裡被忽略,見註 1):

INSERT /*+ append */ INTO _response( RESPONSE_SKID, REQUEST_SKID, HAS_FAILED, WAS_TIMEOUT, IS_PROCESSED, SOAP_REQUEST_TIMESTAMP, SOAP_RESPONSE_TIMESTAMP, RESPONSE_HTTP_STATUS, ERROR_MESSAGE, RESPONSE_BODY )
values ( :1 , :2 , :3 , :4 , :5 , :6 , :7 , :8 , :9 , :10 )

插入到不同表的操作怎麼可能阻塞會話?我正在調查,V$ACTIVE_SESSION_HISTORY但還沒有找到任何東西(我還不是 DBA)

注 1:APPEND 提示被忽略

那不會發生。您可以終止一個會話,或從另一個會話中取消它目前正在執行的 SQL,但您不能結束它的事務(讓會話保持活動狀態)。通常這樣的阻塞會話只是簡單地被殺死。

對於您的另一個問題:在插入到另一個表的另一個會話中阻止另一個事務可能會通過外鍵被阻止。例子:

create table request(c1 number(10, 0) not null primary key);
create table response (c1 number(10, 0) not null,
                      request_c1 number(10, 0) not null references request(c1));

第 1 節:

SQL> insert into request values(1);

1 row created.

尚未送出,會話 1 正在等待。在會話 2 中:

SQL> insert into response values(1, 1);

會話 2 掛在那裡,直到會話 1 執行送出或回滾。

無法以這種方式連接到另一個會話。原始客戶端需要送出送出,或者終止會話並允許事務回滾。

引用自:https://dba.stackexchange.com/questions/268341