PostgreSQL - LOCKS

Khóa hoặc độc quyền khóa hoặc Write Khóa ngăn chặn người dùng thay đổi một hàng hoặc toàn bộ bảng. Các hàng được sửa đổi bởi UPDATE và DELETE sau đó được khóa độc quyền tự động trong suốt thời gian của giao dịch. Điều này ngăn người dùng khác thay đổi hàng cho đến khi giao dịch được cam kết hoặc khôi phục.

Lần duy nhất khi người dùng phải đợi người dùng khác là khi họ đang cố gắng sửa đổi cùng một hàng. Nếu họ sửa đổi các hàng khác nhau, không cần chờ đợi. Truy vấn CHỌN không bao giờ phải đợi.

Cơ sở dữ liệu thực hiện khóa tự động. Tuy nhiên, trong một số trường hợp nhất định, việc khóa phải được điều khiển bằng tay. Khóa thủ công có thể được thực hiện bằng cách sử dụng lệnh LOCK. Nó cho phép đặc tả loại và phạm vi khóa của giao dịch.

Cú pháp cho lệnh LOCK

Cú pháp cơ bản cho lệnh LOCK như sau:

LOCK [ TABLE ]
name
 IN
lock_mode
  • name- Tên (tùy chọn đủ điều kiện giản đồ) của bảng hiện có để khóa. Nếu CHỈ được chỉ định trước tên bảng, thì chỉ bảng đó bị khóa. Nếu ONLY không được chỉ định, bảng và tất cả các bảng con của nó (nếu có) sẽ bị khóa.

  • lock_mode- Chế độ khóa chỉ định khóa này xung đột với khóa nào. Nếu không có chế độ khóa nào được chỉ định, thì ACCESS EXCLUSIVE, chế độ hạn chế nhất, sẽ được sử dụng. Các giá trị có thể có là: ACCESS SHARE, ROW SHARE, ROW EXCLUSIVE, SHARE UPDATE EXCLUSIVE, SHARE, SHARE ROW EXCLUSIVE, EXCLUSIVE, ACCESS EXCLUSIVE.

Sau khi lấy được, khóa sẽ được giữ trong phần còn lại của giao dịch hiện tại. Không có lệnh UNLOCK TABLE; khóa luôn được phát hành khi kết thúc giao dịch.

DeadLocks

Chốt lại có thể xảy ra khi hai giao dịch đang chờ nhau kết thúc hoạt động của chúng. Mặc dù PostgreSQL có thể phát hiện chúng và kết thúc chúng bằng ROLLBACK, nhưng deadlock vẫn có thể gây bất tiện. Để ngăn các ứng dụng của bạn gặp sự cố này, hãy đảm bảo thiết kế chúng theo cách khóa các đối tượng theo cùng một thứ tự.

Khóa tư vấn

PostgreSQL cung cấp các phương tiện để tạo các khóa có ý nghĩa do ứng dụng xác định. Chúng được gọi là khóa tư vấn . Vì hệ thống không thực thi việc sử dụng chúng nên việc sử dụng chúng một cách chính xác tùy thuộc vào ứng dụng. Các khóa tư vấn có thể hữu ích cho các chiến lược khóa không phù hợp với mô hình MVCC.

Ví dụ, cách sử dụng phổ biến của các khóa tư vấn là mô phỏng các chiến lược khóa bi quan điển hình của cái gọi là hệ thống quản lý dữ liệu "tệp phẳng". Mặc dù cờ được lưu trữ trong bảng có thể được sử dụng cho cùng một mục đích, nhưng khóa tư vấn nhanh hơn, tránh hiện tượng cồng kềnh bảng và được máy chủ tự động dọn dẹp vào cuối phiên.

Thí dụ

Xem xét bảng COMPANY có các bản ghi như sau:

testdb# select * from COMPANY;
 id | name  | age | address   | salary
----+-------+-----+-----------+--------
  1 | Paul  |  32 | California|  20000
  2 | Allen |  25 | Texas     |  15000
  3 | Teddy |  23 | Norway    |  20000
  4 | Mark  |  25 | Rich-Mond |  65000
  5 | David |  27 | Texas     |  85000
  6 | Kim   |  22 | South-Hall|  45000
  7 | James |  24 | Houston   |  10000
(7 rows)

Ví dụ sau khóa bảng COMPANY trong cơ sở dữ liệu testdb ở chế độ TRUY CẬP ĐỘC QUYỀN. Câu lệnh LOCK chỉ hoạt động trong chế độ giao dịch -

testdb=#BEGIN;
LOCK TABLE company1 IN ACCESS EXCLUSIVE MODE;

Câu lệnh PostgreSQL đã cho ở trên sẽ tạo ra kết quả sau:

LOCK TABLE

Thông báo trên cho biết bảng bị khóa cho đến khi giao dịch kết thúc và để kết thúc giao dịch, bạn sẽ phải khôi phục hoặc cam kết giao dịch.