#android #многопоточность #sqlite
Есть синхронизация с сервером. Запускаются пару потоков, которые запрашивают данные
и записывают каждый в свою таблицу с помощью транзакций. Возможно ли обеспечить атамарность
всей синхронизации с помощью внутренних транзакций или другим способом?
Простой пример:
new AsyncTask(){
@Override
protected void onPreExecute() {
super.onPreExecute();
db.beginTransactionNonExclusive();
}
@Override
protected Void doInBackground(Void... params) {
db.beginTransactionNonExclusive();
try {
...
db.setTransactionSuccessful();
} finally {
db.endTransaction();
}
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
db.setTransactionSuccessful();
db.endTransaction();
}
}.execute();
Бд лочится и на втором db.beginTransactionNonExclusive()(если нет транзакции, то
на вставке данных) поток останавливается. Коннект к базе один. yieldIfContendedSafely()
вроде должен помочь, но он возвращает false.
Ответы
Ответ 1
Если я правильно понял, то Вас интересует штука под названием "Критические секции". Также, как и Вы, первый раз столкнулся с этим при использовании нескольких потоков, которые оперировали одним и тем же кодом в работе с базой данных. в JAVA предусмотрено решение в виде synchronized метода. Если это то, что Вам нужно, то, думаю нагуглить труда не составит)
Комментариев нет:
Отправить комментарий