BeginTransaction (), endTransaction () y setTransactionSuccessful (). ¿Qué hacen exactamente?

Tengo que proporcionar sincronización al insertar, consultar, actualizar y eliminar elementos de una base de datos. Por lo que entiendo beginTransaction() y beginTransactionNonExclusive() son los métodos que necesito.

Además la documentación de SQLite describe EXCLUSIVE , IMMEDIATE y DEFERRED bastante bien.

Las transacciones pueden ser diferidas, inmediatas o exclusivas. Diferido significa que no se obtienen bloqueos en la base de datos hasta que se accede por primera vez a la base de datos.

Si la transacción es inmediata, los bloqueos RESERVED se obtienen en todas las bases de datos tan pronto como se ejecute el comando BEGIN, sin esperar a que se utilice la base de datos. Después de BEGIN IMMEDIATE, ninguna otra conexión de base de datos podrá escribir en la base de datos o realizar BEGIN IMMEDIATE o BEGIN EXCLUSIVE. Sin embargo, otros procesos pueden seguir leyendo desde la base de datos.

Una transacción exclusiva hace que los bloqueos EXCLUSIVE sean adquiridos en todas las bases de datos. Después de BEGIN EXCLUSIVE, ninguna otra conexión de base de datos excepto las conexiones read_uncommitted podrá leer la base de datos y ninguna otra conexión sin excepción podrá escribir la base de datos hasta que la transacción esté completa.

Parece proporcionar cierta protección contra inserciones no deseadas y consultas mientras que algún hilo está trabajando con la base de datos. Pero no estoy seguro de que garantice la sincronización.

Existe el método insert de mi 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(); } } 

No he tenido ningún problema sin beginTransaction() , endTransaction() y setTransactionSuccessful() antes. ¿Realmente necesito agregarlos?

¡Por supuesto con Android! Si está trabajando para una manipulación fiable de datos, es importante utilizar los siguientes métodos soportados.

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

Para ver más esto … En android es muy importante utilizar las transacciones cuando se trabaja con bases de datos.

Si, SQLite considera un cursor como una transacción, así que si usamos begin transaction () antes de insertar gran cantidad de datos, entonces use setTransactionSuccessful () second, then endTransaction () en finalmente, SQLite considerará esto Insertar evento como una transacción, en lugar de cientos de transacciones.

  • La transacción de Firebase no aborta remotamente si previamente se ha comprometido localmente
  • Android: transacciones SQLite al usar ContentResolver
  • ¿El yieldIfContendedSafely () pierde los beneficios de una transacción?
  • ¿Cómo obtengo el mejor rendimiento con SQLite en Android?
  • Ormlite Android inserciones masivas
  • Android - cuándo llamar a db.setTransactionSuccessful ()?
  • La transacción de Sqlite bloquea Android ui
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.