Скажем, у меня есть следующие транзакции базы данных в потоке (не основном)
query //asynchronous
insertions //synchronous
insertions //synchronous
Из того, что я искал, запросы являются асинхронными, и если они выполняются последовательно с другими синхронными транзакциями, они вызывают проблемы или даже параллельную вставку из разных потоков. Как я могу контролировать, какая процедура выполняется первой?
Действительно, а как быть с параллельными вставками (синхронными) из разных потоков?
Я рекомендую вам попробовать использовать Room с RxJava. Читать далее
Используя Maybe, Single или Flowable, вы можете выполнять свои запросы асинхронно, и вы можете настроить обратный вызов, который будет выполняться, когда он будет завершен (или когда он потерпел неудачу).
И чтобы убедиться, что ваши запросы операций с данными выполняются в правильном порядке в одной транзакции, просто создайте другую функцию с @Transaction в своем классе @Dao. Читать далее
Но как насчет параллельной вставки (синхронной) из разных потоков?
Вы можете привести мне пример того, как это могло произойти? Я имею в виду, вы хотите выполнить их в другом потоке, например, в AsyncTask?
Да, допустим, у меня есть 2 вставки, два разных потока работают вместе. Как база данных справится с этой ситуацией? Будет ли один из потоков приостанавливаться, пока другой не закончит работу, или они будут иметь доступ одновременно? Помогает ли метод runInTransaction?
Android использует SQLite 3.x, и если поток не может получить доступ к базе данных или подключиться к ней, ваши две вставки будут выполняться одновременно, без знания правильного порядка. Если вы действительно хотите убедиться в правильном порядке и / или вам нужно выполнить откат в случае сбоя, вам нужно поместить эти запросы в транзакцию.
Итак, Transaction обеспечивает безопасный способ не выполнять запросы одновременно, верно?
Да. Я думаю, что использование Transaction в вашей ситуации - гораздо лучший подход.
запросы асинхронные? так есть ли какой-либо обратный вызов, предоставляющий возвращенные данные? нет