Manejo de transacciones locales

El manejo de transacciones ha cambiado de manera fundamental. Una transacción SQL es una unidad de trabajo que se ejecuta en un servidor de bases de datos. La unidad de trabajo consiste en una o más sentencias SQL.

De manera predeterminada, el complemento no considera las transacciones SQL. El complemento podría intercambiar conexiones para equilibrar la carga en cualquier momento. Los intercambios de conexión puede ocurrir en mitad de una transacción. Esto va contra la naturaleza de una transacción SQL. De manera predeterminada, el complemento no es seguro con transacciones.

A cualquier tipo de equilibrador de carga de MySQL se le debe indicar el comienzo y el final de una transacción. Esto se puede realizar implícitamente monitorizando las llamadas a la API o usando sugerencias SQL. El complemento admite ambas opciones, dependiendo de la versión de PHP. La monitorización de la API requiere PHP 5.4.0 o posterior. El complemento, al igual que cualquier otro equilibrador de carga de MySQL, no puede detectar los límites de una transacción basada en el Protocolo Cliente Servidor de MySQL. Por lo tanto, la consideración del equilibrado de carga de transacciones totalmente transparente no es posible. La opción menos invasiva es la monitorización de la API, que requiere pocos o ningún cambio en la aplicación, dependiendo de la misma.

Se pueden encontrar ejemplos del uso de sugerencias SQL o de la monitorización de la API en la sección de ejemplos. Los detalles trás la monitorización de la API, la cual hace que el complemento considere las transacciones, están descritos abajo.

Desde PHP 5.4.0, la biblioteca mysqlnd permite al complemento sobrescribir la llamada a set_autocommit() de la API en C de la biblioteca, para detectar el estado del modo autocommit.

Las extensiones de MySQL para PHP emiten una consulta (como SET AUTOCOMMIT=0|1), o usan la llamada a la biblioteca mysqlnd set_autocommit() para controlar el ajuste autocommit. Si una extensión hace uso de set_autocommit(), el complemento puede considerar las transacciones. Hacer que el complemento considere transacciones no se puede realizar si se usa SQL para establecer el modo 'autocommit'. La función set_autocommit() de la biblioteca es invocada por las llamadas a la API de mysqli_autocommit() y PDO::setAttribute(PDO::ATTR_AUTOCOMMIT).

La opción de configuración del complemento trx_stickiness=master se puede usar para hacer que el complemento considere las transacciones. De este modo, el complemento detiene el equilibrado de cara si 'autocommit' se deshabilita, y dirige todas las sentencias al maestro hasta que 'autocommit' se habilite.

Una aplicación que no requiera establecer las sugerencias SQL para las transacciones pero que requiera el uso de una monitorización transparente de la API para evitar cambios en la aplicación debe asegurarse de que los ajustes del modo autocommit son cambiados exclusivamente a través de las llamadas a la API enumeradas.

La detección de los límites de transacciones basada en API ha sido mejorada con PHP 5.5.0 y PECL/mysqlnd_ms 1.5.0 para cubirir no solo llamadas a mysqli_autocommit(), sino también a mysqli_begin(), mysqli_commit() y mysqli_rollback().