Ich habe einigen Strom Artikel Unter der Annahme:Datenbank (SQLite) Transaktion für Downstream-Betreiber mit rxJava
Observable<Item> stream = ...
, was ich erreichen möchte?
- Stream hat eine beliebige Anzahl von Operationen. Alle Operationen, bevor eine Transaktion beginnen sollten außerhalb der Transaktion
- Irgendwie Transaktion des Stroms in der Mitte
db.beginTransaction()
- Alle Betreiber nach dem Start Transaktion innerhalb der Transaktion ausgeführt werden sollten beginnen laufen haben
- Transaktion im Fall abgeschlossen werden von erfolgreichen Operationen
db.setTransactionSuccessful
- Transaktion hat immer
db.endTransaction
- Es beiden Schnipsel haben wird groß sein, beendet sein: offen eine Transaktion in Downstream-Aktivitäten für alle Positionen; Transaktion öffnen und schließen für jedes Artikel in dem Strom
//some upstream operators
stream.doOnNext(i -> ...)
.map(i -> ...)
//somehow start transaction here
//operator inside transaction. All database changes will be reverted in case error
.doOnNext(i -> /*database ops*/)
.subscribe()
PS: db ist Anwendungsinstanz beschreibbarer scoped SQLiteDatabase
ich nun eine Lösung. Aber vielleicht hast du irgendwelche Vorschläge für einen saubereren Weg?
Möchten Sie separate Transaktionen für jedes der 'Items von der Quelle kommen? Was ist 'Datenbank'? Ist es eine Verbindung für dieses bestimmte Element oder eine globale Variable? Wenn es global ist, würde die Transaktion auch global sein.Möchten Sie, dass die Transaktion so lange dauert, bis alle Artikel verarbeitet wurden? –
'Datenbank' ist eine globale Instanz (Anwendungsbereich) der schreibbaren' SQLiteDatabase'. Ich möchte eine Transaktion für die Verarbeitung aller Stream-Elemente öffnen. Aber auch neue Transaktion für jeden Artikel ist ein interessanter Ansatz. Sie haben erwähnt, dass eine solche Transaktion global ist, ist es etwas einschränkt? – Beloo
Globale Transaktion sieht für mich komisch aus. Das bedeutet, dass eine einzelne Transaktion alle Datenbankaktivitäten in Ihrem Programm gleichzeitig umfasst. Daher sollte es nicht viel ausmachen, wann genau Sie Ihre Transaktion starten. Jede Operation in Ihrer Pipeline wird für jeden Artikel wiederholt. Der erste Artikel öffnet die Transaktion, und * alle * Operationen für nachfolgende Artikel werden innerhalb dieser Transaktion sein. –