Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Tìm nguyên nhân gây ra lỗi deadlock từ tệp theo dõi oracle

Trước hết, hãy select tuyên bố không bao giờ khóa bất kỳ thứ gì trong Oracle, chỉ sử dụng phiên bản dữ liệu nhất quán có sẵn cuối cùng. Nó không phải là trường hợp cho select ... for update khóa dữ liệu như update kể từ Oracle 9i, nhưng không có for update mệnh đề trong câu truy vấn từ.

Resource Name          process session holds waits  process session holds waits
TM-000151a2-00000000       210      72    SX   SSX      208      24    SX   SSX

Phiên # 72 giữ khóa cấp bảng (TM) với loại "Dành riêng cho hàng" (SX) và muốn có khóa "Dành riêng cho hàng chia sẻ" (SSX) trên cùng một bảng. Phiên này bị chặn bởi Phiên # 24. Phiên này đã giữ khóa cấp bảng cùng loại (SX) và chờ trong khi khóa SSX sẽ khả dụng.

Resource Name          process session holds waits  process session holds waits
TM-000151a2-00000000       208      24    SX   SSX      210      72    SX   SSX

Điều này (hàng thứ hai) thể hiện chính xác tình huống tương tự, nhưng theo hướng ngược lại:Phiên # 24 chờ khóa SSX khả dụng, nhưng bị chặn bởi Phiên # 72 đã giữ khóa SX trên cùng một bảng.

Vì vậy, Phiên # 24 và Phiên # 72 chặn nhau:xảy ra bế tắc.

Cả hai loại khóa (SX và SSX) đều là khóa cấp bảng.
Để hiểu tình hình, tôi khuyên bạn nên đọc bài viết này của Franck Pachot.

Dưới đây là trích dẫn từ bài viết này, có liên quan trực tiếp đến tình huống của bạn (lưu ý rằng chữ viết tắt SSX và SRX là tương đương nhau):

Tính toàn vẹn tham chiếu cũng có được các khóa TM. Ví dụ:sự kết hợp với khóa ngoại chưa lập chỉ mục dẫn đến khóa S trên bảng con khi bạn thực hiện xóa hoặc cập nhật khóa trên bảng mẹ. Điều này là do không có chỉ mục, nên Oracle không có khóa tài nguyên cấp thấp hơn duy nhất để ngăn chặn việc chèn đồng thời có thể vi phạm tính toàn vẹn tham chiếu.
Khi các cột khóa ngoại là cột chính trong một chỉ mục thông thường, thì mục nhập chỉ mục đầu tiên với giá trị gốc có thể được sử dụng như một tài nguyên duy nhất và được khóa bằng TXlock cấp hàng.
Và điều gì sẽ xảy ra nếu tính toàn vẹn tham chiếu có một dòng thác khi xóa? Không thay đổi chế độ S, có ý định cập nhật các hàng trong bảng con, như với chế độ Hàng X (RX). Đây là nơi xảy ra chia sẻ rowexclusive (SRX):S + RX =SRX.

Vì vậy, biến thể có thể xảy ra nhất là Phiên # 72 và Phiên # 24 xóa một số hàng trong EMPLOYEE cùng một lúc, và có on delete cascade ràng buộc cho EMPSAL_EMP_ID kết hợp với việc không có chỉ mục trên EMPLOYEE_SALARY trong đó EMPSAL_EMP_ID cột được liệt kê đầu tiên.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle lấy khóa ngoại

  2. Phát hiện xem một giá trị có chứa ít nhất một chữ số trong Oracle hay không

  3. Cách thực thi tập lệnh sql Oracle thông qua mã java

  4. 19.3 PDB Đóng ORA-65107 ORA-16078

  5. làm thế nào để nhân bản kết quả sql của tôi?