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

Sử dụng cam kết hai giai đoạn trên bưu điện

Tôi nghĩ rằng bạn đã hiểu sai PREPARE TRANSACTION .

Tuyên bố đó kết thúc hoạt động trên giao dịch, nghĩa là, nó sẽ được phát hành sau tất cả các công việc đã được thực hiện. Ý tưởng là PREPARE TRANSACTION thực hiện mọi thứ có thể thất bại trong quá trình cam kết ngoại trừ bản thân cam kết đó. Điều đó để đảm bảo rằng một COMMIT PREPARED tiếp theo không thể thất bại.

Ý tưởng là quá trình xử lý như sau:

  • Chạy START TRANSACTION trên tất cả cơ sở dữ liệu liên quan đến giao dịch phân tán.

  • Làm tất cả các công việc. Nếu có lỗi, ROLLBACK tất cả các giao dịch.

  • Chạy PREPARE TRANSACTION trên tất cả các cơ sở dữ liệu. Nếu không thành công ở bất kỳ đâu, hãy chạy ROLLBACK PREPARED trên cơ sở dữ liệu nơi giao dịch đã được chuẩn bị và ROLLBACK trên những người khác.

  • Sau khi PREPARE TRANSACTION đã thành công ở mọi nơi, hãy chạy COMMIT PREPARED trên tất cả các cơ sở dữ liệu có liên quan.

Bằng cách đó, bạn có thể đảm bảo "tất cả hoặc không có gì" trên một số cơ sở dữ liệu.

Một thành phần quan trọng mà tôi chưa đề cập ở đây là trình quản lý giao dịch phân tán . Nó là một phần mềm liên tục ghi nhớ vị trí hiện đang xử lý thuật toán ở trên để nó có thể dọn dẹp hoặc tiếp tục cam kết sau khi gặp sự cố.

Nếu không có trình quản lý giao dịch phân tán, cam kết hai giai đoạn không có giá trị nhiều và nó thực sự nguy hiểm:nếu các giao dịch bị mắc kẹt trong giai đoạn “chuẩn bị” nhưng chưa được cam kết, chúng sẽ tiếp tục bị khóa và (trong trường hợp PostgreSQL) chặn công việc autovacuum ngay cả khi máy chủ khởi động lại , vì các giao dịch như vậy cần phải liên tục.

Điều này rất khó để làm đúng.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Asp.net MVC4, PostgreSQL và SimpleMembership

  2. Làm cách nào để nhập tệp .sql vào cơ sở dữ liệu Heroku postgres của tôi?

  3. Có PHP mysql_real_escape_string cho postgresql không?

  4. Trích xuất nhiều cấp độ dữ liệu xml bằng cách sử dụng xpath trong postgres

  5. Cách sử dụng cùng một giá trị nhiều lần trong câu lệnh được soạn sẵn trong jdbc postgresql