Ahora que está conectado a través de PDO, antes de comenzar a realizar consultas, primero debe comprender cómo PDO gestiona las transacciones.
Las transacciones soportan cuatro características principales (ACID):
Atomicidad
Consistencia
Aislamiento
Durabilidad
En términos sencillos, se garantiza que cualquier operación realizada dentro de una transacción, incluso si se realiza en etapas, se aplicará de forma segura a la base de datos y se cometerá sin interferencia de otras conexiones.
Las operaciones de transacción también se pueden deshacer automáticamente a pedido (suponiendo que aún no se hayan confirmado), lo que facilita el manejo de errores en los scripts.
Las transacciones generalmente se implementan "acumulando" un lote de cambios y haciéndolos efectivos al mismo tiempo. La ventaja de hacerlo es que puede mejorar en gran medida la eficiencia de estos cambios.
En otras palabras, las transacciones pueden hacer que los scripts sean más rápidos y potencialmente más robustos (aunque las transacciones deben usarse correctamente para obtener dichos beneficios).
Desafortunadamente, no todas las bases de datos admiten transacciones, por lo que PDO debe ejecutarse en el modo llamado "autocommit" cuando se abre la conexión por primera vez.
El modo de confirmación automática significa que cada ejecución de consulta tiene su propia transacción implícita si la base de datos la admite, o ninguna si la base de datos no admite transacciones.
Si se requiere una transacción, se debe iniciar con el método PDO::beginTransaction(). Si el controlador subyacente no admite transacciones, se genera una PDOException (esta es una condición de error grave independientemente de la configuración de manejo de errores).
Una vez que se inicia una transacción, se puede completar con PDO::commit() o PDO::rollBack(), dependiendo de si el código de la transacción se ejecutó correctamente.
Nota: PDO solo verifica si tiene capacidades de transacción a nivel de conductor. Si alguna condición de tiempo de ejecución significa que una transacción no está disponible y el servicio de base de datos acepta una solicitud para iniciar una transacción, PDO::beginTransaction() seguirá devolviendo VERDADERO sin errores. Un buen ejemplo es intentar utilizar transacciones en una tabla MyISAM en una base de datos MySQL.
Cuando finaliza el script o la conexión está a punto de cerrarse, si hay una transacción pendiente, PDO revertirá automáticamente la transacción. Esta medida de seguridad ayuda a evitar inconsistencias si el script finaliza inesperadamente; si la transacción no se confirma explícitamente, se supone que algo salió mal, por lo que se realiza una reversión para mantener los datos seguros.
Nota: La reversión automática solo puede ocurrir después de iniciar una transacción a través de PDO::beginTransaction(). Si emite manualmente una consulta para iniciar una transacción, PDO no tiene forma de saberlo y no puede revertirla si es necesario.
Ejecutar procesamiento por lotes en una transacción:
En el siguiente ejemplo, supongamos que se crea un conjunto de entradas para un nuevo empleado y se le asigna un ID de 23. Además de registrar los datos básicos de la persona, también es necesario registrar su salario.
Es sencillo realizar ambas actualizaciones por separado, pero al incluirlas en llamadas PDO::beginTransaction() y PDO::commit(), te aseguras de que nadie más pueda ver los cambios hasta que se completen.
Si ocurre un error, el bloque catch revierte todos los cambios que ocurrieron desde que comenzó la transacción e imprime un mensaje de error.
<?phptry { $dbh = new PDO('odbc:SAMPLE', 'db2inst1', 'ibmdb2', array(PDO::ATTR_PERSISTENT => true)); echo "Connectedn";} catch (Excepción $e) { die("No se puede conectar: " . $e->getMessage());}intenta { $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $dbh->beginTransaction(); $dbh->exec("insertar en el personal (id, primero, último) valores (23, 'Joe ', 'Bloggs')"); $dbh->exec("insertar en salariocambio (id, cantidad, fecha de cambio) valores (23, 50000, AHORA())"); $dbh->commit(); } catch (Excepción $e) { $dbh->rollBack(); echo "Error: " . $e->getMessage();}?>
No está limitado a realizar cambios dentro de una transacción, también puede emitir consultas complejas para extraer datos y puede usar esa información para generar más cambios y consultas cuando la transacción está activa, puede garantizar que otros no puedan realizar cambios mientras la transacción esté activa; la operación está en curso.