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

Có thể xảy ra bế tắc khi cập nhật và xóa các hàng khác nhau trong bảng không?

Nếu bạn có thể cập nhật câu hỏi của mình bằng biểu đồ bế tắc, đó sẽ là thông tin hữu ích. (Khi ứng dụng của bạn gặp bế tắc, Oracle sẽ nâng ORA-00060 và tệp theo dõi sẽ được ghi vào user_dump_dest.) Nếu bạn nhìn vào tệp theo dõi, bạn sẽ tìm thấy một phần được gọi là "Đồ thị bế tắc". Nếu bạn có thể đăng điều đó, và cũng đăng tuyên bố gây ra bế tắc và các tuyên bố khác liên quan đến bế tắc đó, thì chúng ta có thể bắt đầu rút ra một số kết luận. (Tất cả thông tin tôi yêu cầu đều có trong tệp theo dõi.)

Như Alessandro đã đề cập, các phiên khóa các hàng khác nhau trong cùng một bảng có thể bị khóa do các khóa ngoại chưa lập chỉ mục trên bảng con của mối quan hệ cha / con. Ngoài ra, có thể bạn có thể gặp bế tắc trên hai phiên cập nhật các hàng khác nhau của cùng một bảng, ngay cả khi bảng không phải là một phần của mối quan hệ cha / con, ví dụ:nếu bảng thiếu mục nhập ITL.

Một lần nữa, hãy đăng thông tin được yêu cầu ở trên và tôi tin rằng chúng tôi có thể xác định nguyên nhân gốc rễ của sự bế tắc của bạn.

Đã thêm vào 30/7/2012 **

Thêm thông tin sau, hiện tại tệp theo dõi bế tắc đã được cung cấp:Được, trước tiên, dựa trên nội dung tệp theo dõi, đây là một bế tắc đơn giản do các phiên chồng chéo / va chạm trên các hàng mà chúng đang cố gắng khóa. Bất chấp những nhận xét trước đây của bạn về sự bế tắc đang ở trên khác nhau hàng, tôi ở đây để nói với bạn rằng bế tắc cụ thể này là do khóa cấp độ hàng trên cùng một hàng.

Thực tế là biểu đồ bế tắc hiển thị chế độ khóa được giữ là 'X' (độc quyền) và chế độ khóa được chờ là 'X', cho tôi biết đây là khóa cấp độ hàng đơn giản.

Trong trường hợp này, SID 20 đang thực thi "xóa khỏi RPT_TABLE.TEMP_TABLE_T1 trong đó TEMP_T1_ID =:1" và đã có khóa trên AAAPDIAAMAAAEfIAAA có hàng rào.

Trong khi đó, SID 790 đang thực thi "RPT_TABLE.T1_UPDATE_StoredProc", trong khi đã giữ khóa trên rowid AAAPDIAAMAAAEfGAAA.

Lưu ý từ phần "Hàng đã chờ trên" của tệp theo dõi, rằng SID 20 đang đợi trên hàng mà SID 790 giữ và SID 790 đang đợi trên hàng mà SID 20 đang giữ. Đây là một bế tắc cổ điển.

Một số thông tin bổ sung:

  • Loại enqueue là TX (xem biểu đồ bế tắc), vì vậy, đây chắc chắn là không khóa do khóa ngoại không được lập chỉ mục. Nếu nó đang bị khóa do FK không được lập chỉ mục, thì kiểu hàng đợi sẽ là TM, không phải TX. (Có ít nhất một trường hợp khác mà TM enqueue có liên quan và nó không phải là FK chưa lập chỉ mục. Vì vậy, đừng cho rằng TM enqueue luôn có nghĩa là FK chưa lập chỉ mục.)

  • Chế độ khóa đang được chờ là 'X' (độc quyền), vì vậy đây là chế độ khóa cấp hàng. Nếu chế độ chờ được bật là 'S' (chia sẻ) thì chế độ đó sẽ không được khóa ở cấp độ hàng. Thay vào đó, đó có thể là sự thiếu hụt ITL hoặc sự thực thi của PK hoặc Vương quốc Anh.

Hy vọng điều đó sẽ hữu ích!



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Thử thách kiểm tra cơ sở dữ liệu Oracle - So sánh dữ liệu lược đồ

  2. ORA-01461:có thể liên kết một giá trị LONG chỉ để chèn vào cột DÀI-Xảy ra khi truy vấn

  3. Toán tử nối chuỗi trong Oracle là gì?

  4. Làm cách nào để chuyển động các giá trị cho toán tử IN?

  5. BDE vs ADO ở Delphi