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

Khóa hàng cơ sở dữ liệu trong nhiều giao dịch

Giải pháp của bạn với lá cờ có vẻ khả thi và tôi nghĩ điều duy nhất cần thiết là làm cho khóa hết hạn. Về cơ bản, cách tôi kiến ​​trúc khóa là tôi sẽ viết dấu thời gian khi khóa được thực hiện và tạo nó để quá trình sẽ phải cập nhật khóa thường xuyên (tức là cứ 30 giây một lần) trong khi nó vẫn hoạt động trên hồ sơ. Nếu quy trình bị chết hoặc không thể hoàn thành công việc, khóa sẽ hết hạn và các quy trình khác có thể mở khóa nó nếu hơn gấp đôi khoảng thời gian chờ trôi qua.

Khi một quá trình kết thúc hoạt động trên một bản ghi, nó sẽ xóa cờ khóa và đánh dấu bản ghi là đã xử lý (lại một lá cờ khác).

Bạn có thể sẽ muốn có hai trường:một trường sẽ lưu trữ cờ khóa dấu thời gian và một trường khác cho biết tiến trình nào sở hữu khóa (trong trường hợp bạn quan tâm đến nó). Tôi giả định rằng có một số loại khóa có thể được sử dụng để sắp xếp các bản ghi trong bảng sao cho khái niệm "hành động tiếp theo" là có ý nghĩa.

Bạn có thể sử dụng một truy vấn như thế này để lấy bản ghi tiếp theo để xử lý:

 -- find the next available process and "lock" it by updating it's flag
 UPDATE actions_tabe
    SET LockFlag = @timestamp,
        Process = @processname
  WHERE Id IN (SELECT Id
            FROM actions_table
           WHERE LockFlag IS null
             AND IsComplete = '0'
             AND ScheduledTime < now()
           ORDER BY Scheduledtime ASC, Id ASC
           LIMIT 1);

 -- return the Id and Action of the record that was just marked above
 SELECT Id, Action
   FROM actions_table
  WHERE Process = @processname

Fiddle mẫu tại đây: http://sqlfiddle.com/#!11/9c120/26 / 1




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách cập nhật hàng loạt ID chuỗi postgreSQL cho tất cả các bảng

  2. Flask-SQLAlchemy db.session.query (Model) so với Model.query

  3. Lỗi trong diễn biến trên Heroku

  4. Không thể giải mã bằng pgcrypto từ AES-256-CBC nhưng AES-128-CBC thì OK

  5. Không có thay đổi nào được phát hiện khi tôi thực thi Python management.py makemigrations và di chuyển