Nếu bạn cần khôi phục giao dịch, tôi khuyên bạn nên sử dụng thứ gì đó khác ngoài Redis. Các giao dịch của Redis không giống với các kho dữ liệu khác. Ngay cả Multi / Exec cũng không hoạt động cho những gì bạn muốn - đầu tiên là vì không có khả năng khôi phục. Nếu bạn muốn khôi phục, bạn sẽ phải kéo cả hai danh sách xuống để có thể khôi phục - và hy vọng rằng giữa tình trạng lỗi của chúng tôi và "khôi phục" không có ứng dụng khách nào khác cũng sửa đổi một trong hai danh sách. Làm điều này một cách lành mạnh và đáng tin cậy không phải là việc tầm thường, cũng không đơn giản. Nó cũng có thể không phải là một câu hỏi hay cho SO vì nó sẽ rất rộng và không cụ thể cho Redis.
Bây giờ là lý do tại sao EXEC không làm những gì người ta có thể nghĩ. Trong kịch bản đề xuất của bạn, MULTI / EXEC only xử lý các trường hợp:
- Bạn thiết lập XEM để đảm bảo không có thay đổi nào khác xảy ra
- Khách hàng của bạn chết trước khi phát hành EXEC
- Redis hết bộ nhớ
Hoàn toàn có thể xảy ra lỗi khi phát hành lệnh EXEC. Khi bạn phát hành EXEC, Redis sẽ thực thi tất cả các lệnh trong hàng đợi và trả về danh sách các lỗi. Nó sẽ không cung cấp trường hợp bổ sung vào danh sách-1 hoạt động và bổ sung vào danh sách-2 không thành công. Bạn vẫn sẽ có hai danh sách của mình không đồng bộ. Khi bạn phát hành, hãy nói một LPUSH sau khi phát hành MULTI, bạn sẽ luôn nhận lại được OK
trừ khi bạn:
- a) trước đó đã thêm một chiếc đồng hồ và một số thứ trong danh sách đó đã thay đổi hoặc
- b) Redis trả về một điều kiện OOM để phản hồi lại một lệnh đẩy được xếp hàng đợi
DISCARD không hoạt động như một số người nghĩ. DISCARD được sử dụng thay vì EXEC, không phải là một cơ chế hoàn vốn. Sau khi bạn phát hành EXEC, giao dịch của bạn đã hoàn tất. Redis hoàn toàn không có bất kỳ cơ chế hoàn trả nào - đó không phải là ý nghĩa của giao dịch Redis.
Chìa khóa để hiểu những gì Redis gọi là giao dịch là nhận ra chúng về cơ bản là một hàng đợi lệnh ở cấp độ kết nối máy khách. Chúng không phải là một máy trạng thái cơ sở dữ liệu.