У меня есть длительная операция, которую я выполняю в фоновом потоке.Поскольку важно, чтобы операция была либо успешно завершена, либо не завершена вообще, я обертываю всю операцию в транзакцию.
Аспектам пользовательского интерфейса необходим доступ только для чтения к базе данных в течение этого времени.Чтобы избежать блокировки пользовательского интерфейса, я экспериментирую со вставкой вызовов на db.yieldIfContendedSafely()
в основной цикл фоновой операции.
Это делает то, что я хочу, в том, что пользовательский интерфейс больше не блокируется, но не совсем ясномне, если это рискует потерять целостность данных.
Javadoc для yieldIfContendedSafely()
говорит:
Временно завершите транзакцию, чтобы запустить другие потоки.До сих пор предполагается, что транзакция прошла успешно.Не вызывайте setTransactionSuccessful перед вызовом этого.Когда он вернется, новая транзакция будет создана, но не помечена как успешная.Это предполагает, что нет вложенных транзакций (beginTransaction был вызван только один раз) и будет выдавать исключение, если это не так.
Означает ли это, что моя длительная операция фактически выполняетсяв базу данных отдельными частями, или транзакция в целом поддерживает достаточно состояния, чтобы зафиксировать весь лот за один раз в конце, таким образом сохраняя целостность данных?