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.
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.Dưới đây là một số kiểu khóa phổ biến và chức năng của chúng:
Đâ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;
Đượ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;
Đượ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;
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;
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;
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;
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;
Đâ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;
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.
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.
LOCK
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.