             }
         }
         
-        // 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 }

        onChange: @escaping (Reducer.Value) -> Void)
        -> TransactionObserver
    {
        if scheduler.impl.fetchOnStart() {
            do {
                try onChange(unsafeReentrantRead(observation.fetchValue))


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,
