Sửa lỗi ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired
Khi bạn thao tác trên cơ sở dữ liệu với Oracle, có thể gặp phả lỗi: ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired.
Nguyên nhân
Ngôn ngữ định nghĩa dữ liệu (DDL - Data definition language) - dùng để định nghĩa cấu trúc của cơ sở dữ liệu. Ngôn ngữ thao tác dữ liệu (DML - Data manipulation language) - dùng để định nghĩa các thao tác trên cơ sở dữ liệu của bạn.
Để đảm bảo tính toàn vẹn dữ liệu, cơ sở dữ liệu sẽ khóa một bảng hoặc một hàng trong bảng đó trước khi cập nhật hoặc lấy dữ liệu. Do DDL và DML ảnh hưởng đến tất cả các hàng trong một bảng nên vì thế nó cần một khóa Exclusive lock và các khóa hiện có trên bất kỳ hàng nào trong bảng đó đều dẫn đến lỗi.
Exclusive lock, hay còn gọi là read-write lock (khóa đọc ghi) là loại khóa mà một luồng xử lý phải sở hữu khi muốn cập nhật một vùng nhớ được chia sẻ.
Trong Oracle, khi DDL và DML gặp phải một khóa, chúng ta sẽ nhận được thông báo lỗi: ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired.
Hướng giải quyết
- Tìm và tắt những phiên nào gây cản trở đến exclusive lock.
- Trong Oracle 11g, bạn có thể đặt ddl_lock_timeout, ví dụ, cho phép DDL chờ một đối tượng, chỉ cần chỉ định thời gian bạn muốn nó chờ đợi bằng câu lệnh:
SQL> alter session set ddl_lock_timeout = 600;
Session altered.
Chúc bạn thành công.
Bình luận