Or, even better:
def runTxn[A](client: MongoClient)(txn: ClientSession => Observable[A]): Observable[A] = {
for {
session <- client.startSession()
_ = session.startTransaction()
res <- txn(session)
_ <- session.commitTransaction()
_ = session.close()
} yield res
}