Transactional effect in Scala
Introduction
This blogpost inspired by StackOverflow answer for question: Compose Futures with Recovery in Scala: is it possible to compose Future
's in a manner if one of them will fail, previous Future
's execution result will be
rolled back via some function.
The problem
Case with Future
can be generalized to some effect F[_]
, so we can say: How we can compose effects F[_]
in a manner if one of them will fail, previous F[_]
execution result will be rolled back via some function. This behaviour similar to what we know as Transaction.
Solution
For code solution below cats-effect
version `2.3.1` used. Final solution with a small demo can look like:
Which will print out next output (shorter for sake of example):
A executed
B executed
B recovered
A recovered
java.lang.Exception: C failed
Also you can play with demo in Scatie: https://scastie.scala-lang.org/W8qmBrVQRx6izAVo3Q9yvg
Thank you for attention and hope it will be helpfull.