A partir de Drupal 9.5, se empezará a emitir una alerta en el informe de estado de que la base de datos debería estar usando "READ COMMITTED" como nivel de aislamiento de transacciones (por defecto, MySQL / MariaDB usan “REPEATABLE READ”).
Puede verse el change record aquí.
A continuación, se muestran un par de maneras de cambiar el nivel de manera permanente:
Arrancar la base de datos con el atributo "--transaction-isolation=READ-COMMITTED"
Esta es la manera más rápida de hacerlo si se usa docker. Ejemplo para docker-compose (archivo docker-compose.yml):
db:
image: mysql:8
command: --transaction-isolation=READ-COMMITTED
...
Nota: Puede usarse junto a otros atributos. Ejemplo:
db:
image: mysql:8
command: --default-authentication-plugin=mysql_native_password --transaction-isolation=READ-COMMITTED
...
Archivo de configuración
Puede añadirse un archivo de configuración con el siguiente contenido:
[mysqld]
transaction-isolation = READ-COMMITTED
Esta opción es la más sencilla para cuando se usa una bd en nativo o DDEV.
- Ubicación del archivo en DDEV:
.ddev/mysql/[NOMBRE].cnf
- Ubicación del archivo en nativo (varias posibilidades):
/etc/my.cnf /etc/mysql/my.cnf ~/.my.cnf
Manera de comprobar el nivel de aislamiento actual
Una vez dentro de la consola de MySQL / MariaDB puede comprobarse con show variables like '%isolation%';
MySQL [db]> show variables like '%isolation%';
+-----------------------+----------------+
| Variable_name | Value |
+-----------------------+----------------+
| transaction_isolation | READ-COMMITTED |
+-----------------------+----------------+
Hostings
Algunos hostings no permiten cambiar el nivel de aislamiento personalmente. Una manera de salvar este escollo es añadiendo la declaración en el array de conexión a bd en el settings*.php:
'init_commands' => [
'isolation_level' => 'SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED',
],
Eso sí, hay que tener en cuenta que eso es una llamada más a la bd en cada petición a la web.
Imagen de cabecera: Jandira Sonnendeck de Unsplash