PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

bế tắc postgresql

Đây là hai nhận xét được chèn với cùng một content_id. Chỉ cần chèn nhận xét sẽ tạo ra một khóa CHIA SẺ trên hàng nội dung, để dừng một giao dịch khác xóa hàng đó cho đến khi giao dịch đầu tiên hoàn tất.

Tuy nhiên, trình kích hoạt sau đó tiếp tục nâng cấp khóa lên ĐỘC QUYỀN và điều này có thể bị chặn bởi một giao dịch đồng thời thực hiện cùng một quy trình. Hãy xem xét chuỗi sự kiện sau:

Txn 2754                      Txn 2053
Insert Comment
                              Insert Comment
Lock Content#935967 SHARE
  (performed by fkey)
                              Lock Content#935967 SHARE
                                (performed by fkey)
Trigger
Lock Content#935967 EXCLUSIVE
(blocks on 2053's share lock)
                              Trigger
                              Lock Content#935967 EXCLUSIVE
                              (blocks on 2754's share lock)

Vì vậy- bế tắc.

Một giải pháp là ngay lập tức có một khóa độc quyền trên hàng nội dung trước chèn nhận xét. tức là

SELECT 1 FROM content WHERE content.id = 935967 FOR UPDATE
INSERT INTO comment(.....)

Một giải pháp khác chỉ đơn giản là tránh hoàn toàn mẫu "số lượng được lưu trong bộ nhớ cache" này, ngoại trừ trường hợp bạn có thể chứng minh nó là cần thiết cho hiệu suất. Nếu vậy, hãy cân nhắc giữ số lượng được lưu trong bộ nhớ cache ở một nơi khác ngoài bảng nội dung-- ví dụ:một bàn dành riêng cho quầy. Điều đó cũng sẽ cắt giảm lưu lượng cập nhật vào bảng nội dung mỗi khi nhận xét được thêm vào. Hoặc có thể chỉ cần chọn lại số lượng và sử dụng memcached trong ứng dụng. Thực tế là không có gì phải bàn cãi rằng bất cứ nơi nào bạn lưu trữ số lượng được lưu trong bộ nhớ cache này sẽ là một điểm khó khăn, nó phải được cập nhật một cách an toàn.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Phương pháp hay nhất để lưu trữ các chuỗi đa ngôn ngữ

  2. Không thể gọi 11 Thủ tục được lưu trữ của PostgreSQL với Hibernate

  3. Truy xuất tệp từ bytea trong PostgreSQL bằng java

  4. PostgreSQL - cơ sở dữ liệu được khôi phục nhỏ hơn ban đầu

  5. Postgres - cách mã hóa một cột và dữ liệu của anh ấy