Что произойдет, если во время транзакции SQLite в Android второй поток попытается выполнить транзакцию в той же таблице? - PullRequest
2 голосов
/ 30 марта 2012

Я не совсем понимаю правильную схему использования транзакций SQLite в Android.

Допустим, метод А запускает транзакцию.Во время выполнения транзакции другой метод B попытается выполнить транзакцию в той же таблице (возможно, в той же строке).

Что произойдет?

Будет ли метод B "ждать"пока метод А не завершит транзакцию, а затем выполнит транзакцию?Или произойдет сбой преобразования метода B?

Как мне правильно с этим справиться?

Точнее:

  • Метод A должен запрашивать (внутри транзакции), если определенная строка уже существует, и если да, вернуть строку, если эта определенная строка еще не существует, она должна вставить эту строку и вернуть вновь вставленную строку.
  • Метод B должен запросить (внутри транзакции), если определенная строка уже существует, обновите эту строку, если строка еще не существует, метод B должен вставить эту строку.

Идея состоит в том, чтобы убедиться, что, независимо от того,какой метод сначала выполняется, чтобы либо вставить, либо обновить эту конкретную строку, я даже не уверен, можно ли это сделать на уровне транзакций SQLite, или мне нужно синхронизировать методы в Java?

Если да, может ли кто-нибудь опубликовать пример, как такая синхронизация должна быть закодирована в Java?

Ответы [ 3 ]

1 голос
/ 30 марта 2012

Если «A» изменяет таблицу в транзакции, «B» следует заблокировать (внутри самого SQLite), пока «A» не будет зафиксирован.Это очень похоже на синхронизацию Java, за исключением того, что имеет дело с постоянными данными.Некоторые детали зависят от уровня изоляции

http://en.wikipedia.org/wiki/Isolation_(database_systems)

0 голосов
/ 30 марта 2012

Транзакции устанавливаются "beginTransaction", поэтому, насколько я понимаю, транзакции являются эксклюзивными.

@ sseand: Интересно, что немецкая версия упомянутых статей Википедии несколько отличается от английской версии.Немецкая версия утверждает, что приложение с уровнем изоляции «serializable» должно быть в состоянии обрабатывать ошибки сериализации и повторно запускать соответствующую транзакцию.Поэтому я ожидаю, что для этого есть исключение SQLiteSerializationException.Но я не вижу такого исключения в API.Итак, SQLite API для Android автоматически обрабатывает это?

0 голосов
/ 30 марта 2012

Зависит от того, что вы подразумеваете под «транзакцией».

Если вы имеете в виду транзакции, установленные SQLiteDatabase.beginTransaction или beginTransactionNonExclusive, то применяются правила для этих методов.Я бы сказал, что вы должны выполнить beginTransaction для метода A, запустить его до конца и затем завершить транзакцию.Если метод B пытается выполнить транзакцию, он должен столкнуться с исключением.Транзакции позволяют вам выполнять несколько операций и возвращать их обратно, если они не работают.

Я не могу сказать, будут ли работать отдельные потоки, из того, что вы опубликовали.Вы можете рассмотреть возможность использования IntentService для обработки ваших транзакций;таким образом, одна транзакция не может начаться, пока не закончится предыдущая.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...