Cuối cùng, tôi đã phải đối mặt với rất nhiều sự tranh chấp khóa hàng. Bảng trong tranh chấp dường như là một bảng cụ thể.
Đây thường là những gì xảy ra -
- Nhà phát triển 1 bắt đầu giao dịch từ màn hình giao diện người dùng của Oracle Forms
- Nhà phát triển 2 bắt đầu một giao dịch khác, từ một phiên khác sử dụng cùng một màn hình
~ 5 phút sau, mặt trước có vẻ không phản hồi. Các phiên kiểm tra cho thấy sự tranh chấp khóa hàng. "Giải pháp" mà mọi người ném xung quanh là giết phiên: /
Là một nhà phát triển cơ sở dữ liệu
- Những gì có thể được thực hiện để loại bỏ tranh chấp khóa hàng?
- Có thể tìm ra dòng nào của một thủ tục được lưu trữ đang gây ra sự tranh chấp khóa hàng này không
- Điều gì sẽ là hướng dẫn chung để giảm / tránh / loại bỏ các vấn đề như vậy mà mã hóa?
Nếu câu hỏi này cảm thấy quá mở / không đủ thông tin, vui lòng chỉnh sửa / cho tôi biết - tôi sẽ cố gắng hết sức để thêm vào một số thông tin bổ sung.
Bảng được đề cập nằm trong rất nhiều phần chèn và cập nhật, tôi muốn nói rằng đây là một trong những bảng bận rộn nhất. SP khá phức tạp - để đơn giản hóa - nó lấy dữ liệu từ nhiều bảng khác nhau, đưa nó vào các bảng làm việc, rất nhiều thao tác số học xảy ra trên bảng làm việc và kết quả của bảng làm việc được chèn / cập nhật vào bảng trong câu hỏi.
Phiên bản cơ sở dữ liệu là Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64bit. Luồng logic được thực hiện theo cùng một thứ tự trong cả hai phiên, giao dịch không được mở quá lâu (hoặc ít nhất là tôi nghĩ vậy) và các khóa xảy ra trong quá trình thực hiện giao dịch.
Cập nhật: Số lượng hàng của bảng lớn hơn tôi dự kiến, vào khoảng 3,1 triệu hàng. Ngoài ra, sau khi theo dõi một phiên, tôi thấy rằng một vài câu lệnh cập nhật cho bảng này không sử dụng chỉ mục. Tại sao nó lại như vậy - tôi không chắc chắn. Cột được tham chiếu trong mệnh đề where được lập chỉ mục. Tôi hiện đang xây dựng lại chỉ mục.
COMMIT
hay ROLLBACK
trong một thời gian hợp lý hoặc b) sắp xếp như vậy mà mọi người cùng không phải lúc nào muốn cùng hàng cùng một lúc.