I can't find the reference now, but either in a screencast or a discussion I read it was mentioned that if you have a single thing that performs side-effects, you can perform this function last in the transaction without worrying about any issues. The reasoning here is that if anything before it fails, the side-effect action was never attempted and if the side-effect action itself fails then the transaction rolls back like always.
On Wednesday, February 20, 2013 9:32:14 AM UTC-5, Balint Erdi wrote: > > Hey, > > So yesterday we discussed concurrency at our meetup ( > http://www.meetup.com/Budapest-Clojure-User-Group/) and a question > occurred to me. > > Suppose we have a classic web application. (I'm not currently building > such a web app in Clojure, so that's a "theoretical" question). > > When the user signs up, a verification email has to be sent and the > database entry related to the user has to be updated (or a new datom > created ;) ) to reflect the fact that we've sent out the email to the user. > > First, we want this to be consistent so that the "verification_sent_out" > db field reflects whether the email has really been sent out or not. > Secondly, we also want the email to only be sent out once. > > My first idea was to use a transaction but if the transaction retries, the > email could be sent out several times. A fellow Clojurian advised the > sending of the email to be performed by an agent. The agent is "transaction > aware" so if the wrapping transaction is retried several times it only > sends out the email when the transaction successfully runs. > > Is this how this actually works? Is there another, simpler and/or more > robust solution? In the languages I come from (e.g Ruby) I'd use a library > that handles the queueing and consumption of tasks. Is this how you'd do it > in Clojure or it's one of these cases where Clojure itself suffices where > other languages are lacking? > > Thank you for your answer, > -- > Balint > > -- -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en --- You received this message because you are subscribed to the Google Groups "Clojure" group. To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/groups/opt_out.