BeginTransaction (), endTransaction () и setTransactionSuccessful (). Что именно они делают?

Я должен обеспечить синхронизацию при вставке, запросе, обновлении и удалении элементов из базы данных. Насколько я понимаю, beginTransaction() и beginTransactionNonExclusive() – это методы, которые мне нужны.

Кроме того, документация SQLite описывает EXCLUSIVE , IMMEDIATE и DEFERRED достаточно хорошо.

Сделки могут быть отсрочены, немедленно или исключены. Отсрочка означает, что в базе данных не фиксируются блокировки до момента обращения к базе данных.

Если транзакция немедленна, блокировки RESERVED будут получены во всех базах данных, как только будет выполнена команда BEGIN, не дожидаясь использования базы данных. После BEGIN IMMEDIATE никакое другое соединение с базой данных не сможет записать в базу данных или выполнить BEGIN IMMEDIATE или BEGIN EXCLUSIVE. Однако другие процессы могут продолжать считывать из базы данных.

Исключительная транзакция вызывает блокировку EXCLUSIVE для всех баз данных. После BEGIN EXCLUSIVE никакое другое соединение с базой данных, кроме подключений read_uncommitted, не сможет прочитать базу данных, и никакое другое соединение без исключения не сможет записать базу данных до завершения транзакции.

Кажется, что он обеспечивает некоторую защиту от нежелательных вставок и запросов, а некоторые потоки работают с базой данных. Но я не уверен, что он гарантирует синхронизацию.

Существует метод insert моего ContentProvider .

 @Override public Uri insert(Uri baseUri, ContentValues values) { try { mDatabase = mHelper.getWritableDatabase(); mDatabase.beginTransaction(); // EXCLUSIVE switch (sUriMatcher.match(baseUri)) { case UriCodes.COUNTRIES: case UriCodes.CONTINENTS: case UriCodes.ORGS: String table = baseUri.getLastPathSegment(); long rowId = mDatabase.insert(table, null, values); Uri uri = Uri.withAppendedPath(baseUri, Long.toString(rowId)); mDatabase.setTransactionSuccessful(); return uri; default: mDatabase.endTransaction(); throw new IllegalArgumentException(UNSUPPORTED_URI + SPACE + baseUri); } } finally { mDatabase.endTransaction(); } } 

У меня не было никаких проблем без beginTransaction() , endTransaction() и setTransactionSuccessful() раньше. Мне действительно нужно добавить их?

Solutions Collecting From Web of "BeginTransaction (), endTransaction () и setTransactionSuccessful (). Что именно они делают?"

Вне курса с Android! Если вы работаете над надежной обработкой данных, важно использовать следующие поддерживаемые методы.

 BeginTransaction(); SetTransactionSuccessful(); EndTransaction(); 

Для дальнейшего ознакомьтесь с этим … В android очень важно использовать транзакции при работе с базами данных.

Да, это делает приложение гладким. Поскольку SQLite рассматривает один курсор как одну транзакцию, поэтому, если мы используем begin transaction (), прежде чем вставлять большой объем данных, тогда используйте setTransactionSuccessful () second, а затем endTransaction (), наконец, SQLite рассмотрит это Вставлять событие как одну транзакцию, а не сотни транзакций.