Асинхронные транзакции в комнате

Скажем, у меня есть следующие транзакции базы данных в потоке (не основном)

query  //asynchronous 
insertions  //synchronous 
insertions  //synchronous 

Из того, что я искал, запросы являются асинхронными, и если они выполняются последовательно с другими синхронными транзакциями, они вызывают проблемы или даже параллельную вставку из разных потоков. Как я могу контролировать, какая процедура выполняется первой?

запросы асинхронные? так есть ли какой-либо обратный вызов, предоставляющий возвращенные данные? нет

pskink 07.06.2018 11:11

Действительно, а как быть с параллельными вставками (синхронными) из разных потоков?

user9907820 07.06.2018 11:14
1
2
1 602
1

Ответы 1

Я рекомендую вам попробовать использовать Room с RxJava. Читать далее

Используя Maybe, Single или Flowable, вы можете выполнять свои запросы асинхронно, и вы можете настроить обратный вызов, который будет выполняться, когда он будет завершен (или когда он потерпел неудачу).

И чтобы убедиться, что ваши запросы операций с данными выполняются в правильном порядке в одной транзакции, просто создайте другую функцию с @Transaction в своем классе @Dao. Читать далее

Но как насчет параллельной вставки (синхронной) из разных потоков?

user9907820 07.06.2018 12:31

Вы можете привести мне пример того, как это могло произойти? Я имею в виду, вы хотите выполнить их в другом потоке, например, в AsyncTask?

Yosi Pramajaya 07.06.2018 12:45

Да, допустим, у меня есть 2 вставки, два разных потока работают вместе. Как база данных справится с этой ситуацией? Будет ли один из потоков приостанавливаться, пока другой не закончит работу, или они будут иметь доступ одновременно? Помогает ли метод runInTransaction?

user9907820 07.06.2018 13:17

Android использует SQLite 3.x, и если поток не может получить доступ к базе данных или подключиться к ней, ваши две вставки будут выполняться одновременно, без знания правильного порядка. Если вы действительно хотите убедиться в правильном порядке и / или вам нужно выполнить откат в случае сбоя, вам нужно поместить эти запросы в транзакцию.

Yosi Pramajaya 07.06.2018 13:35

Итак, Transaction обеспечивает безопасный способ не выполнять запросы одновременно, верно?

user9907820 07.06.2018 13:41

Да. Я думаю, что использование Transaction в вашей ситуации - гораздо лучший подход.

Yosi Pramajaya 07.06.2018 13:53

Другие вопросы по теме