Làm thế nào để khắc phục sự cố enq: TX - tranh chấp khóa hàng?


9

Tôi có tình huống sau đây.

Tôi có RAC. Trên cả hai nút có các khóa.

Trên nút đầu tiên

    SID EVENT                           USERNAME    BLOCKING_SESSION    ROW_WAIT_OBJ#   OBJECT_NAME LOCKWAIT            SQL_ID          STATUS
1   102 enq: TX - row lock contention   MYUSER      155                 136972          TABLE1V     0000000810EFA958    5f4bzdg49fdxq   ACTIVE
2   111 enq: TX - row lock contention   MYUSER      155                 136972          TABLE1V     0000000810EFAC98    5f4bzdg49fdxq   ACTIVE

Chặn thông tin phiên

    SID EVENT                       USERNAME    ROW_WAIT_OBJ#   OBJECT_NAME LOCKWAIT    SQL_ID          STATUS
1   155 SQL*Net message from client MYUSER      136971          MyTABLEIMAGES_IDPK      4hw85z8absbjc   INACTIVE

Trên nút thứ hai

    SID EVENT                           USERNAME    BLOCKING_SESSION    ROW_WAIT_OBJ#   OBJECT_NAME   LOCKWAIT          SQL_ID          STATUS
1   65  enq: TX - row lock contention   MYUSER      155                 137033          FactTABLE1V   0000000810EF9B58  1mznc2z75ksdx   ACTIVE
2   111 enq: TX - row lock contention   MYUSER      155                 136972          TABLE1V       0000000810EF9818  5f4bzdg49fdxq   ACTIVE

Chặn thông tin phiên

    SID EVENT                       USERNAME    ROW_WAIT_OBJ#   OBJECT_NAME  SQL_ID  STATUS
1   155 SQL*Net message from client MYUSER      127176          MYTableLOG           INACTIVE

Thông tin bổ sung: Chặn phiên SQL_TEXT

create or replace procedure ACTIONProcedureDELETE
(
p_ID NUMBER
)
 is

 cursor oldval is select r.id,r.sessionstatus
  from MyTABLEIMAGES  r where r.idparent=p_ID;

begin
       update  actionmyTableblock r  set r.status='False' where  ID=p_ID;

   for oldvalItem in oldval loop

    if oldvalItem.Sessionstatus='True' then
      update MyTABLEIMAGES r set r.sessionstatus='False' where r.id=oldvalItem.Id;
    else
      update MyTABLEIMAGES r set r.sessionstatus='True' where r.id=oldvalItem.Id;
    end if;
  end loop;

end ACTIONProcedureDELETE;

Làm thế nào để tôi khắc phục sự cố này?

Như bạn có thể thấy phiên chặn là không hoạt động nhưng vẫn khóa.

Nếu tôi select v$sql_bind_capturekhông có giá trị cho VALUE_STRINGviệc chặn phiên sql_id.

Bắt đầu từ đâu?

Tôi có thể đoán rằng thiếu cam kết / rollback nhưng nhà phát triển ứng dụng nói "Tôi có mọi thứ đều ổn, tôi đã viết cam kết khi cần thiết"

Hãy giúp tôi.

Câu trả lời:


6

Truy vấn v$transactiontrên mỗi nút để xem các phiên không được cam kết:

SELECT t.start_time, s.sid, s.serial#, s.username, s.status,s.schemaname, s.osuser
   , s.process, s.machine, s.terminal, s.program, s.module
   , to_char(s.logon_time,'DD/MON/YY HH24:MI:SS') logon_time
FROM v$transaction t, v$session s
WHERE s.saddr = t.ses_addr
ORDER BY start_time;

5

Bạn có thể tránh tranh chấp khóa hàng bằng cách đảm bảo rằng hàng có sẵn để cập nhật trước với một SELECT FOR UPDATEvà , WAIT Xhoặc NOWAIT, ví dụ:

create or replace procedure ACTIONProcedureDELETE (p_ID NUMBER)
 is

 cursor oldval is select r.id,r.sessionstatus
  from MyTABLEIMAGES  r where r.idparent=p_ID FOR UPDATE NOWAIT;

 l_id NUMBER;

begin
   select id into l_id from actionmyTableblock where ID=p_ID 
      FOR UPDATE of status NOWAIT;

   update  actionmyTableblock r  set r.status='False' where  ID=p_ID;

   for oldvalItem in oldval loop

    if oldvalItem.Sessionstatus='True' then
      update MyTABLEIMAGES r set r.sessionstatus='False' where r.id=oldvalItem.Id;
    else
      update MyTABLEIMAGES r set r.sessionstatus='True' where r.id=oldvalItem.Id;
    end if;
  end loop;

end ACTIONProcedureDELETE;

Nếu hàng bị khóa, bạn sẽ nhận được ORA-00054, trong hầu hết các trường hợp thích hợp hơn là chờ đợi vô thời hạn.


0

bạn có thể sử dụng chọn để cập nhật bỏ qua khóa, thanh lịch hơn và an toàn hơn


Tôi không biết đủ về vấn đề để có thể biết câu trả lời của bạn có đúng hay không. Tuy nhiên, nó hơi ngắn - hãy nhìn vào những người khác. Câu trả lời ở đây phải được kèm theo một phần mở rộng của một số loại và có thể liên kết đến tài liệu! Tôi có một liên kết đến cách trả lời các câu hỏi của Jon Skeet (hơn 1 triệu điểm trên StackExchange) - có lẽ bạn muốn xem nó và thử làm theo gợi ý của nó? Chào mừng bạn đến với diễn đàn! :-)
Vérace
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.