Jestem świadomy, że generalnie złym zwyczajem jest umieszczanie funkcji z efektami ubocznymi w transakcjach STM, ponieważ mogą one potencjalnie być wielokrotnie ponawiane i wywoływane.Używanie agentów do uzupełniania efektów ubocznych w transakcjach STM
Wydaje mi się jednak, że można użyć agentów, aby zapewnić, że efekty uboczne zostaną wykonane dopiero po pomyślnym zakończeniu transakcji.
np.
(dosync
// transactional stuff
(send some-agent #(function-with-side-effects params))
// more transactional stuff
)
Czy to dobra praktyka?
Jakie są zalety/wady/pułapki?
Jedną z podstawowych idei STM jest brak atomowości. Jak by to pomogło w tym? –
Chodzi o efekty uboczne, które muszą wystąpić po pomyślnej transakcji, ale same nie są częścią transakcji, np. wysyłanie wiadomości e-mail z potwierdzeniem. Oczywiście, nie chcesz tego robić za każdym razem, gdy ponawiasz próbę transakcji, bo inaczej możesz dostać bardzo złego/zdezorientowanego odbiorcę! – mikera