Tôi đang xem xét sử dụng TVar để lưu trữ một số trạng thái trong ứng dụng web (có thể được tạo lại khi khởi động lại). Tuy nhiên, các khía cạnh tranh chấp của TVar liên quan đến tôi. Dường như một giao dịch ngắn hạn thường xuyên có thể khiến các giao dịch dài hơn bị gián đoạn bằng cách liên tục làm gián đoạn chúng. Ngoài ra, khi các giao dịch chạy lâu hơn tiếp tục khởi động lại, điều này sẽ làm tăng tải trên CPU, có xu hướng tăng thêm độ dài của các giao dịch này. Cuối cùng tôi cảm thấy điều này có thể khiến máy chủ trở nên hoàn toàn không phản hồi.Haskell: TVar: Ngăn chặn nạn đói
Xét này, tôi có những câu hỏi này:
(1) TVar (hoặc kiểu dữ liệu khác) có thể sử dụng ổ khóa, không đồng thời nỗ lực/lần thử lại.
(2) TVar (hoặc loại dữ liệu khác) có một số cơ chế tranh chấp khác nhau, nghĩa là "cho phép giao dịch chạy một giây trước khi chạy giao dịch khác", hoặc ít nhất một số đảm bảo rằng giao dịch cuối cùng sẽ hoàn thành. ngăn chặn starvation cho các giao dịch đang chạy lâu hơn).
Lưu ý 'thử lại 'không khởi động lại giao dịch ngay lập tức; các giao dịch chỉ thử lại khi 'TVar' chúng sử dụng được sửa đổi. – ehird
@ehird: Các giao dịch không tự động thử lại ngay lập tức nếu một giao dịch khác ghi vào TV mà chúng đã đọc trước đó (ngay cả khi không có lệnh gọi lại 'thử lại ')? – Clinton
@Clinton: Có, họ thử lại, nhưng chỉ sau khi hệ thống thời gian chạy phát hiện khả năng có kết quả khác nhau của giao dịch. I E. nó chờ cho đến khi một TV đọc trước khi thử lại đã thay đổi. Mà biến bận rộn chờ đợi vào một chương trình thông báo đẩy. – jmg