Страницы

Поиск по вопросам

пятница, 24 января 2020 г.

Вложенные транзакции и многопоточность

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

Комментариев нет:

Отправить комментарий