Предполагая, что у меня есть некоторый поток элементов:базы данных (SQLite) транзакции для последующих операторов с rxJava
Observable<Item> stream = ...
Что я пытаюсь достичь?
- Поток имеет любое количество операций. Все операции до начала транзакции должны выполняться вне транзакции
- Как-то начать транзакцию в середине потока
db.beginTransaction()
- Все операторы после запуска транзакции должны быть запущены внутри транзакции
- Сделки должны быть завершены в случае успешных операций
db.setTransactionSuccessful
- сделка должна быть всегда заканчивалось
db.endTransaction
- Это будет здорово иметь и фрагменты: открытые одна сделка для всех элементов в последующих операциях; открытия и закрытия транзакции для каждого элемента в потоке
//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 является применение областью действия экземпляра записываемой SQLiteDatabase
У меня есть решение в настоящее время. Но, может быть, у вас есть какие-то предложения относительно более чистого способа?
Вы хотите отдельные транзакции для каждого из '' '' '' '' '' '' '' '' 'исхода от источника? Что такое «база данных»? Это соединение для этого конкретного элемента или некоторой глобальной переменной? Если он глобальный, транзакция также будет глобальной.Вы хотите, чтобы транзакция продолжалась до тех пор, пока все элементы не обработаны? –
'database' - это глобальный экземпляр (область применения) записываемой' SQLiteDatabase'. Я хочу открыть одну транзакцию для обработки всех элементов потока. Но новая транзакция для каждого элемента также интересна. Вы упомянули, что такая сделка глобальна, она что-то ограничивает? – Beloo
Глобальная транзакция выглядит странно для меня. Это означает, что одна транзакция будет включать все действия базы данных, которые происходят в вашей программе одновременно. Как следствие, это не имеет большого значения, когда вы начинаете свою транзакцию. Каждая операция в вашем конвейере будет повторяться для каждого элемента. Первый элемент должен открыть транзакцию, и * все * операции для последующих элементов будут находиться внутри этой транзакции. –