Tôi muốn soạn các thao tác có thể không thành công, nhưng có cách quay lại.Hoạt động giống nguyên tử có thể ghép nối
Ví dụ: cuộc gọi bên ngoài để đặt phòng khách sạn và cuộc gọi bên ngoài để tính phí thẻ tín dụng. Cả hai cuộc gọi đó có thể không thành công như không còn phòng, thẻ tín dụng không hợp lệ. Cả hai đều có cách quay trở lại - hủy phòng khách sạn, hủy bỏ phí tín dụng.
- Có tên cho loại nguyên tử này (không thực) không. Bất cứ khi nào tôi tìm kiếm giao dịch haskell, tôi nhận được
STM
. - Có cách trừu tượng, cách soạn thảo hoặc thư viện trong haskell hoặc bất kỳ ngôn ngữ nào khác không?
Tôi cảm thấy bạn có thể viết một đơn nguyên Atomic T
sẽ theo dõi các hoạt động này và cuộn lại nếu có ngoại lệ.
Edit:
Các hoạt động này có thể IO
hoạt động. Nếu các hoạt động chỉ là hoạt động bộ nhớ, như hai câu trả lời gợi ý, STM sẽ đủ.
Ví dụ: đặt phòng khách sạn sẽ thông qua các yêu cầu HTTP. Các hoạt động cơ sở dữ liệu như chèn bản ghi thông qua giao tiếp socket.
Trong thế giới thực, đối với các hoạt động không thể đảo ngược, có thời gian gia hạn trước khi thực hiện thao tác - ví dụ: thanh toán bằng thẻ tín dụng và đặt phòng khách sạn có thể được thanh toán vào cuối ngày và do đó, bạn có thể hủy trước đó.
Ah, nhưng STM đặc biệt nghiêm cấm IO. Câu hỏi này hỏi về các hành động IO có thể được đảo ngược nếu cần thiết với một hành động IO thứ hai. –
STM là rất tương thích với các hành động IO - nó chỉ không thực hiện chúng trực tiếp (http://book.realworldhaskell.org/read/software-transactional-memory.html). Không phải tất cả IO * có thể * được giao dịch - không có hành động 'rollback' cho' launchMissiles' – amindfv
Tôi không thấy câu hỏi đó đề cập cụ thể đến 'IO'. Nhưng trong mọi trường hợp, câu trả lời cho 'IO' là nó không thể được thực hiện, bởi vì đơn nguyên' IO' có các phép toán hủy diệt thông tin một cách không hủy ngang, và không có cách nào để sao chép trạng thái. Thực tế, đơn nguyên 'IO' được thiết kế đặc biệt cho điều đó! –