#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 метода. Если это то, что Вам нужно, то, думаю нагуглить труда не составит)
Комментариев нет:
Отправить комментарий