Los desarrolladores del proyecto SQLite han comenzado a probar un backend experimental llamado HCtree, que soporta el bloqueo a nivel de filas (row) y proporciona un alto nivel de paralelismo en el procesamiento de consultas. Este nuevo backend está diseñado para mejorar la eficiencia del uso de SQLite en sistemas cliente-servidor que manejan un gran número de solicitudes concurrentes a la base de datos para escritura.
Las estructuras b-tree, que se utilizan en SQLite para almacenar datos, no están diseñadas para este tipo de carga, lo que limita a SQLite a escribir solo en un solo hilo. Como parte de un experimento, los desarrolladores comenzaron a desarrollar una solución alternativa que utiliza la estructura HC-tree, más adecuada para paralelizar operaciones de escritura.
Para organizar la ejecución concurrente de múltiples operaciones en HCtree, se aplica un mecanismo de separación de transacciones, que utiliza bloqueos a nivel de páginas y es similar al MVCC (control de concurrencia multiversión), pero emplea verificaciones de transacciones basadas en claves y rangos de claves en vez de conjuntos de páginas. Las operaciones de lectura y escritura se llevan a cabo en relación con un snapshot de la base de datos, cuyos cambios son visibles en la base de datos principal solo después de que se complete la transacción.
Los clientes pueden utilizar tres operaciones para abrir transacciones:
- «BEGIN» — las transacciones no tienen en cuenta los datos de acceso de otros clientes. Si se ejecutan operaciones de escritura dentro de la transacción, esta solo puede ser confirmada si durante su ejecución no hubo otras operaciones de escritura en la base de datos.
- «BEGIN CONCURRENT» — las transacciones recogen información sobre el acceso de otros clientes. Si se ejecutan operaciones de escritura dentro de la transacción, esta puede ser confirmada si, desde la creación del snapshot, se han confirmado otras transacciones en la base de datos.
- «BEGIN EXCLUSIVE» — tras abrir la transacción, se bloquean las operaciones de otras transacciones hasta que se complete.
HCtree admite la replicación estilo «master-slave», permitiendo transferir transacciones a otra base de datos y mantener las bases de datos secundarias en un estado sincronizado con la base de datos principal. HCtree también elimina la limitación en el tamaño de la base de datos: en lugar de identificadores de páginas de datos de 32 bits, HCtree utiliza identificadores de 48 bits, lo que incrementa el tamaño máximo de la base de datos de 16 tebibytes a 1 exbibyte (un millón de tebibytes). Se espera que el rendimiento de SQLite con el backend HCtree no sea inferior al del clásico backend de un solo hilo. Los clientes de SQLite que soporten HCtree podrán acceder tanto a bases de datos basadas en la estructura HC-tree como a antiguas bases de datos SQLite.
Fuente: opennet.ru
