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

Làm cách nào để tránh điều kiện chủng tộc khi sử dụng phương thức find_or_create của DBIx ::Class ::ResultSet?

Không, tài liệu không chính xác. Sử dụng một giao dịch đơn lẻ thì không tránh vấn đề này. Nó chỉ đảm bảo rằng toàn bộ giao dịch được khôi phục nếu một ngoại lệ xảy ra - để không có trạng thái không nhất quán nào được duy trì trong cơ sở dữ liệu.

Để tránh vấn đề này bạn phải khóa bảng - bên trong một giao dịch, bởi vì tất cả các khóa được giải phóng khi kết thúc một giao dịch. Một cái gì đó như:

BEGIN;
LOCK TABLE mytbl IN SHARE MODE;

-- do your find_or_create here

COMMIT;

Nhưng đó không phải là một phương pháp chữa bệnh kỳ diệu cho mọi thứ. Nó có thể trở thành một vấn đề về hiệu suất và có thể xảy ra bế tắc (các giao dịch đồng thời cố gắng khóa tài nguyên mà giao dịch kia đã khóa). PostgreSQL sẽ phát hiện một điều kiện như vậy và hủy bỏ tất cả ngoại trừ một trong các giao dịch cạnh tranh. Bạn phải chuẩn bị để thử lại thao tác khi không thành công.

Hướng dẫn PostgreSQL về khóa.

Nếu bạn không có nhiều đồng thời, bạn cũng có thể bỏ qua vấn đề. Khoảng thời gian rất nhỏ nên nó chỉ rất hiếm khi thực sự xảy ra. Nếu bạn gặp lỗi vi phạm khóa trùng lặp, điều này sẽ không gây hại gì, thì bạn cũng đã bao gồm lỗi này.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. date_trunc khoảng thời gian 5 phút trong PostgreSQL

  2. truy vấn đệ quy postgres trên cùng một bảng

  3. Kích thước được khai báo của trường varchar có bất kỳ tác động nào trong PostgreSQL không?

  4. PostgresSQL / pgAdmin4 / phiên bản máy chủ kết xuất không khớp

  5. Làm cách nào để LIÊN KẾT một danh sách các bảng được truy xuất từ ​​một bảng khác bằng một truy vấn duy nhất?