             }
         }
         
-        // Return a dummy observer, because read-only ValueObservation
-        // never changes.
-        return DummyObserver()
+        return observer
     }
 }
 
+// TODO: remove when we have proper support for cancellation
 /// Support for DatabaseReader.addReadonly(observation:onError:onChange:)
 private class DummyObserver: TransactionObserver {
     func observes(eventsOfKind eventKind: DatabaseEventKind) -> Bool { false }

                onError(error)
            }
        } else {
            asyncRead { dbResult in
                let result = dbResult.tryMap(observation.fetchValue)
                scheduler.impl.schedule {
                    do {
                        try onChange(result.get())
                    } catch {


extension DatabaseReader {
    // MARK: - Value Observation Support
    
    /// Adding an observation in a read-only database emits only the
    /// initial value.
    func addReadOnly<Reducer: _ValueReducer>(
        observation: ValueObservation<Reducer>,
        scheduler: ValueObservationScheduler,
