BeginTransaction(), endTransaction() и setTransactionSuccessful(). Что именно они делают? - программирование

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

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

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

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

Если транзакция немедленна, то ЗАБРОНИРОВАННЫЕ блокировки все базы данных, как только выполняется команда BEGIN, без ожидая использования базы данных. После НАЧАТЬ НЕМЕДЛЕННОГО, никаких других соединение с базой данных сможет записывать в базу данных или выполнять НАЧАТЬ НЕМЕДЛЕННО ИЛИ НАЧАТЬ ЭКСКЛЮЗИВ. Другие процессы могут прочитайте из базы данных.

Исключительная транзакция вызывает блокировку 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() раньше. Мне действительно нужно добавить их?

4b9b3361

Ответ 2

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