Có ai có kinh nghiệm họ có thể chia sẻ bằng cách sử dụng MySQL savepoints (trực tiếp hoặc qua ORM), đặc biệt là trong một dịch vụ web không tầm thường? Bạn đã sử dụng chúng ở đâu? Họ có đủ đáng tin cậy không (giả sử bạn sẵn sàng chạy một phiên bản MySQL gần đây) hoặc quá chảy máu hoặc đắt tiền?Việc sử dụng các điểm lưu trữ MySQL trong các dịch vụ web trong thế giới thực?
Cuối cùng, có ai có kinh nghiệm về điều gì đó giống như trường hợp sử dụng sau đây và bạn có sử dụng các điểm lưu trữ cho nó không? Giả sử điểm chính của một số đơn vị công việc cụ thể là thêm một hàng vào bảng Orders
(hoặc bất kỳ thứ gì, không nhất thiết phải liên quan đến đơn đặt hàng) và cập nhật bảng OrdersAuditInfo
, trong cùng một giao dịch. Điều quan trọng là Orders
được cập nhật nếu có thể, nhưng bảng OrdersAuditInfo
không quan trọng (ví dụ: bạn chỉ cần đăng nhập lỗi vào tệp, nhưng tiếp tục với giao dịch tổng thể). Ở cấp độ thấp, nó có thể trông giống như thế này (cảnh báo, giả SQL theo sau):
BEGIN;
INSERT INTO Orders(...) VALUES (...);
/* Do stuff outside of SQL here; if there are problems, do a
ROLLBACK and report an error (i.e., Order is invalid in this
case anyway). */
SAVEPOINT InsertAudit;
INSERT INTO OrdersAudit(...) VALUES(...);
/* If the INSERT fails, log an error to a log file somewhere and do: */
ROLLBACK TO SAVEPOINT InsertAudit;
/* Always want to commit the INSERT INTO Orders: */
COMMIT;
Nhưng ngay cả ở đây có lẽ sẽ có thành ngữ tốt hơn (hoặc ít nhất là phổ biến hơn)? Người ta có thể thực hiện việc chèn OrdersAuditInfo
vào một giao dịch hoàn toàn khác nhưng sẽ tốt hơn nếu được đảm bảo rằng bảng OrdersAuditInfo
là không được ghi trừ khi kết quả cuối cùng là COMMIT
.
Lý do tại sao tôi muốn OrdersAudit là một phần của giao dịch tổng thể là trong trường hợp việc chèn vào Đơn đặt hàng không thành công tại thời điểm COMMIT vì một lý do nào đó. –