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.