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

Các tình huống tương tranh với INSERTs

Vấn đề của bạn bắt nguồn từ câu hỏi về "khóa đồng bộ hóa nên là gì" . Từ câu hỏi của bạn, có vẻ như đặt phòng không phải là đặt một mặt hàng cụ thể. Nhưng hãy giả sử rằng một người dùng đang đặt một phòng khách sạn cụ thể, vì vậy bạn cần giải quyết hai vấn đề:

  • ngăn việc đặt trước quá nhiều (ví dụ:đặt cùng một thứ cho hai người)
  • ngăn chặn tính toán sai trạng thái tài khoản song song

Vì vậy, khi người dùng đến một thời điểm khi họ chuẩn bị nhấn xác nhận , đây là một tình huống có thể xảy ra mà bạn có thể thực hiện:

  1. bắt đầu giao dịch

  2. khóa mục nhập của người dùng để các quá trình song song bị chặn

    SELECT * FROM user FOR UPDATE WHERE id = :id

  3. kiểm tra lại số dư tài khoản và đưa ra ngoại lệ / hoàn trả nếu không có đủ tiền

  4. khóa mặt hàng cần đặt để tránh đặt trước quá nhiều

    SELECT * FROM room FOR UPDATE WHERE id = :id

  5. kiểm tra lại tình trạng còn hàng của lượt đặt trước và đưa ra trường hợp ngoại lệ / hoàn trả nếu mặt hàng đã được đặt trước

  6. tạo mục đặt chỗ và trừ tiền từ tài khoản của người dùng

  7. cam kết giao dịch (tất cả các khóa sẽ được giải phóng)

Trong trường hợp của bạn, nếu bạn không cần kiểm tra việc đặt trước quá nhiều, chỉ cần bỏ qua / bỏ qua bước 4 và 5.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm thế nào để bạn làm toán ngày mà bỏ qua năm?

  2. Số tuần tùy chỉnh của PostgreSQL - tuần đầu tiên có ngày 1 tháng 2

  3. Trừ hai bản ghi của cùng một cột trong một bảng

  4. PostgreSQL Upsert với mệnh đề WHERE

  5. Thu hồi quyền truy cập vào cơ sở dữ liệu postgres cho một vai trò