Trong PostgreSQL, lệnh để khóa một bảng là lệnh LOCK. Lệnh này cho phép khóa một bảng để ngăn các thao tác khác xảy ra trên bảng trong quá trình thực hiện các thao tác quan trọng, đảm bảo tính toàn vẹn và đồng nhất của dữ liệu.

Cú pháp cơ bản của lệnh LOCK:

LOCK TABLE table_name IN lock_mode;
  • table_name: Tên của bảng cần khóa.
  • lock_mode: Kiểu khóa (lock mode) bạn muốn áp dụng. PostgreSQL hỗ trợ nhiều kiểu khóa khác nhau, từ khóa chỉ đọc đến khóa độc quyền (exclusive lock). Nếu không chỉ định kiểu khóa, mặc định là ACCESS EXCLUSIVE, loại khóa mạnh nhất.

Các kiểu khóa trong PostgreSQL

Dưới đây là một số kiểu khóa phổ biến và chức năng của chúng:

ACCESS SHARE

Đây là mức khóa thấp nhất, cho phép các truy vấn SELECT xảy ra đồng thời nhưng ngăn không cho thực hiện các thao tác thay đổi dữ liệu (như INSERT, UPDATE, DELETE, ALTER). Sử dụng khi bạn chỉ muốn đọc dữ liệu mà không bị ảnh hưởng bởi các thay đổi.

LOCK TABLE table_name IN ACCESS SHARE MODE;

ROW SHARE

Được sử dụng bởi các câu lệnh SELECT FOR UPDATE hoặc SELECT FOR SHARE. Nó cho phép đọc và ghi dữ liệu đồng thời nhưng ngăn các thay đổi cấu trúc bảng.

LOCK TABLE table_name IN ROW SHARE MODE;

ROW EXCLUSIVE

Được sử dụng bởi các thao tác INSERT, UPDATE, DELETE. Khóa này ngăn cản các thao tác đọc ghi đồng thời nhưng cho phép nhiều phiên (session) thực hiện các thao tác thay đổi dữ liệu cùng lúc.

LOCK TABLE table_name IN ROW EXCLUSIVE MODE;

SHARE UPDATE EXCLUSIVE

Cho phép thực hiện SELECT và các thao tác ghi, nhưng ngăn không cho các thay đổi cấu trúc bảng (như thêm cột hoặc thay đổi bảng).

LOCK TABLE table_name IN SHARE UPDATE EXCLUSIVE MODE;

SHARE

Khóa này cho phép thực hiện các thao tác đọc, nhưng ngăn chặn các thay đổi dữ liệu hoặc cấu trúc bảng.

LOCK TABLE table_name IN SHARE MODE;

SHARE ROW EXCLUSIVE

Khóa này cho phép các thao tác đọc dữ liệu nhưng ngăn không cho thực hiện các thay đổi đồng thời từ nhiều phiên khác nhau.

LOCK TABLE table_name IN SHARE ROW EXCLUSIVE MODE;

EXCLUSIVE

Ngăn chặn các thao tác đọc và ghi dữ liệu đồng thời từ các phiên khác, nhưng cho phép thao tác SELECT.

LOCK TABLE table_name IN EXCLUSIVE MODE;

ACCESS EXCLUSIVE

Đây là kiểu khóa mạnh nhất, ngăn tất cả các thao tác khác, bao gồm cả đọc và ghi. Thường được sử dụng cho các thao tác như ALTER TABLE, DROP TABLE, hoặc khi cần chắc chắn rằng không có thao tác nào khác diễn ra trên bảng.

LOCK TABLE table_name IN ACCESS EXCLUSIVE MODE;

Ví dụ:

Khóa bảng để ngăn chặn mọi thao tác trong khi thực hiện thay đổi quan trọng:

LOCK TABLE orders IN ACCESS EXCLUSIVE MODE;

Lệnh này sẽ khóa bảng orders để không cho phép bất kỳ thao tác nào khác, kể cả đọc dữ liệu, trong khi thay đổi đang diễn ra.

Khóa bảng chỉ để ngăn các thao tác ghi, cho phép đọc:

LOCK TABLE customers IN SHARE MODE;

Với lệnh này, bảng customers sẽ bị khóa để ngăn các thao tác thay đổi dữ liệu (ghi), nhưng các truy vấn đọc (SELECT) vẫn được phép.


Ghi chú khi sử dụng lệnh LOCK

  • Khóa bảng cần thận trọng: Khóa bảng có thể ảnh hưởng đến hiệu suất và ngăn chặn các phiên khác truy cập vào bảng. Vì vậy, nó thường được sử dụng trong các tình huống cần thao tác quan trọng hoặc yêu cầu tính toàn vẹn dữ liệu trong khi thực hiện các thay đổi.
  • Tự động khóa: PostgreSQL thường tự động khóa các bảng khi cần (ví dụ khi thực hiện INSERT, UPDATE, hoặc DELETE). Tuy nhiên, lệnh LOCK có thể được sử dụng để áp dụng khóa thủ công trong các kịch bản phức tạp hơn.