PostgreSQL - Khóa: Hướng dẫn cho người mới bắt đầu
Xin chào các nhà thuật toán tương lai! Hôm nay, chúng ta sẽ bắt đầu một hành trình thú vị vào thế giới của các khóa trong PostgreSQL. Đừng lo lắng nếu bạn chưa từng viết một dòng mã trước đây - tôi sẽ là người hướng dẫn thân thiện của bạn trong chuyến phiêu lưu này, dựa trên kinh nghiệm dạy học của tôi để đảm bảo bạn hiểu rõ từng bước.
Khóa là gì?
Trước khi chúng ta đi sâu vào chi tiết, hãy bắt đầu với một ví dụ đơn giản. Hãy tưởng tượng bạn đang ở trong thư viện và bạn muốn mượn một cuốn sách. Bạn lấy nó ra khỏi kệ, và trong khi bạn đang đọc, không ai khác có thể mượn cuốn sách đó. Đó chính là điều mà một khóa làm trong cơ sở dữ liệu - nó ngăn không cho nhiều người cùng một lúc sửa đổi cùng một dữ liệu, điều này có thể dẫn đến sự nhầm lẫn và lỗi.
Các loại khóa trong PostgreSQL
PostgreSQL sử dụng nhiều loại khóa khác nhau để quản lý truy cập đồng thời vào dữ liệu. Dưới đây là bảng tóm tắt các loại chính:
Loại Khóa | Mô tả |
---|---|
Khóa cấp hàng | Bảo vệ các hàng riêng lẻ khỏi bị sửa đổi đồng thời |
Khóa cấp bảng | Bảo vệ toàn bộ bảng khỏi một số thao tác |
Khóa tư vấn | Các khóa do người dùng định nghĩa cho mục đích cụ thể của ứng dụng |
Bây giờ, hãy cùng khám phá chi tiết từng loại!
Khóa cấp hàng
Khóa cấp hàng là loại phổ biến nhất mà bạn sẽ gặp. Chúng được áp dụng tự động khi bạn sửa đổi dữ liệu trong bảng.
BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
-- Hàng với id = 1 bây giờ đã bị khóa
COMMIT;
Trong ví dụ này, khi bạn bắt đầu cập nhật số dư cho tài khoản 1, PostgreSQL tự động khóa hàng đó. Nếu một giao dịch khác cố gắng sửa đổi cùng hàng trước khi bạn xác nhận, nó sẽ phải chờ.
Khóa cấp bảng
Khóa cấp bảng bảo vệ toàn bộ bảng. Chúng ít phổ biến hơn nhưng đôi khi cần thiết cho các thao tác ảnh hưởng đến toàn bộ bảng.
BEGIN;
LOCK TABLE accounts IN EXCLUSIVE MODE;
-- Toàn bộ bảng accounts bây giờ đã bị khóa
UPDATE accounts SET interest_rate = interest_rate + 0.01;
COMMIT;
Mã này khóa toàn bộ bảng accounts
, sau đó cập nhật tất cả các hàng. Điều này giống như đặt một biển báo "Đừng làm phiền" trên toàn bộ kệ sách thay vì chỉ một cuốn sách!
Đ死锁
Bây giờ, hãy nói về một điều khó khăn hơn: deadlock. Hãy tưởng tượng có hai người mỗi người giữ một cuốn sách mà người kia muốn. Không ai có thể tiếp tục đọc cho đến khi họ có được cuốn sách của người khác, nhưng không ai sẽ từ bỏ cuốn sách hiện tại của mình. Đó là deadlock!
Trong PostgreSQL, deadlock có thể xảy ra khi hai giao dịch chờ nhau để解锁. Dưới đây là một ví dụ:
-- Giao dịch 1
BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
-- Giao dịch 2 (chạy cùng lúc)
BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE id = 2;
UPDATE accounts SET balance = balance + 100 WHERE id = 1;
Nếu các giao dịch này chạy cùng lúc, chúng có thể deadlock: Giao dịch 1 giữ khóa trên tài khoản 1 và chờ tài khoản 2, trong khi Giao dịch 2 giữ khóa trên tài khoản 2 và chờ tài khoản 1.
May mắn thay, PostgreSQL có thể phát hiện deadlock và sẽ tự động hủy một trong hai giao dịch để giải quyết tình huống này. Điều này giống như một thư viện viên介入 để giải quyết tranh chấp trao đổi sách!
Khóa tư vấn
Cuối cùng, hãy nói về khóa tư vấn. Đây là loại đặc biệt vì bạn, người phát triển, quyết định khi nào sử dụng chúng. Điều này giống như tạo ra biển báo "Đừng làm phiền" của riêng bạn trong thư viện!
Dưới đây là cách bạn có thể sử dụng một khóa tư vấn:
-- Lấy một khóa tư vấn
SELECT pg_advisory_lock(123);
-- Làm một số công việc ở đây...
-- Thả khóa
SELECT pg_advisory_unlock(123);
Trong ví dụ này, 123
là một số ngẫu nhiên bạn chọn để nhận diện khóa của mình. Bất kỳ quá trình nào khác cố gắng lấy khóa với cùng số sẽ phải chờ cho đến khi bạn thả nó.
Khóa tư vấn rất hữu ích cho việc phối hợp các hoạt động trong ứng dụng của bạn mà không liên quan đến các đối tượng cơ sở dữ liệu cụ thể. Ví dụ, bạn có thể sử dụng chúng để đảm bảo chỉ một phiên bản của một công việc hàng loạt chạy cùng một lúc.
Kết luận
Và đây bạn đã có, các bạn! Chúng ta đã cùng nhau hành trình qua thế giới của các khóa trong PostgreSQL, từ các khóa cấp hàng phổ biến đến các khái niệm phức tạp hơn như deadlock và các khóa tư vấn tùy chỉnh. Nhớ rằng, các khóa giống như đèn giao thông của cơ sở dữ liệu của bạn - chúng giúp mọi thứ chạy mượt mà và ngăn chặn các va chạm.
Khi bạn tiếp tục hành trình PostgreSQL của mình, bạn sẽ gặp nhiều tình huống phức tạp hơn liên quan đến khóa. Nhưng đừng lo lắng - với nền tảng này, bạn đã sẵn sàng đối mặt với những thử thách đó. Hãy tiếp tục thực hành, 保持好奇心, và chúc bạn mã hóa vui vẻ!
Credits: Image by storyset