6

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 OrdersAuditInfokhông được ghi trừ khi kết quả cuối cùng là COMMIT.

Trả lời

1

Tôi thường có xu hướng tránh SAVEPOINT, vì nó có thể làm cho mã khó hiểu và dễ xác minh.

Trong trường hợp bạn đăng, gói trong một giao dịch sẽ phụ thuộc vào việc có OrdersAudit bản ghi chính xác tương ứng với Orders hay không, là một phần của quy tắc kinh doanh của bạn.

CHỈNH SỬA: Chỉ cần đọc lại câu hỏi của bạn và bạn không có yêu cầu đối với thư từ được đảm bảo giữa OrdersAuditOrders. Vì vậy, tôi sẽ không sử dụng bất kỳ giao dịch nào cho việc chèn các bản ghi OrdersAudit.

+0

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 đó. –

Các vấn đề liên quan